在 Lua 中获取 UTC UNIX 时间戳

Posted

技术标签:

【中文标题】在 Lua 中获取 UTC UNIX 时间戳【英文标题】:Getting UTC UNIX timestamp in Lua 【发布时间】:2017-10-07 00:27:21 【问题描述】:

API 将时间戳作为 UTC 的 UNIX 时间戳返回,我想知道这个时间戳是否早于 x 秒前。正如预期的那样,这适用于 UTC 中的os.time() - x > timestamp,但在其他时区会崩溃。

不幸的是,我在 lua 中找不到解决此问题的好方法。

os.date! 前缀(例如 os.date("!%H:%M:%S"))以返回 UTC 时间,但似乎尽管文档说明它支持所有 strftime 选项,但这不支持 %s 选项.我听说有人提到这是由类似问题的 Lua 编译时选项引起的,但由于解释器是由用户提供的,因此无法更改这些选项。

【问题讨论】:

【参考方案1】:

好的,所以您需要 UTC 时间。请记住,os.time 实际上是 knows nothing about timezones,例如:

os.time(os.date("!*t"))
    将获取 UTC 时间并填充表结构。 将根据当前时区将表结构转换为 unix 时间戳。

所以你实际上会得到你的 UNIX_TIME - TIMEZONE_OFFSET。如果您在 GMT+5,您将获得 UTC-5 的时间戳。

在lua中做时间转换的正确方法是:

os.time() -- get current epoch value
os.time ...  -- get epoch value for local date/time values
os.date("*t"),os.date("%format") -- get your local date/time
os.date("!*t") or os.date("!%format") -- get UTC date/time
os.date("*t", timestamp),os.date("%format", timestamp) -- get your local date/time for given timestamp
os.date("!*t", timestamp) or os.date("!%format", timestamp) -- get UTC date/time for given timestamp

感谢Monshttps://gist.github.com/ichramm/5674287。

如果您确实需要将任何 UTC 日期转换为时间戳,请在此问题中很好地说明如何执行此操作:Convert a string date to a timestamp

【讨论】:

【参考方案2】:

os.time() 为您提供 unix 时间戳。时间戳是自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数,因此不同时区的时间戳是相同的。

例如,运行以下代码:

print('timestamp', os.time())
print('local hour', os.date("*t").hour)
print('utc hour', os.date("!*t").hour)

大概,您的本地时间和 UTC 时间是不同的。 Also run it in an online repl。服务器的本地时间和UTC时间是一样的,但是你和服务器的时间戳是差不多的。

【讨论】:

【参考方案3】:

你可以使用

os.time(os.date("!*t"))

获取当前的 UNIX 纪元。

【讨论】:

哦,这很有意义。我已经尝试过相反的方法,但我无法让它做任何有用的事情! 性能说明:这比使用 os.time() 并减去差异大约慢 500 倍。然而,因为我预计这种方法会出现错误,并且预计最大 msg/sec 约为 200,所以我会选择这个。 很高兴你测量了。 实际上,它在我的系统上失败了。 linux date 返回 14:40,date -u 返回 12:40,但 lua os.time(os.date("!*t")) 返回对应 13:40 的 1562240400,所以似乎存在时区/DST 问题 os.time(os.date("*t")) 没有夏令时问题

以上是关于在 Lua 中获取 UTC UNIX 时间戳的主要内容,如果未能解决你的问题,请参考以下文章

unix时间戳小示例linux/unix系统获取unix时间戳

Java 获取 Unix时间戳

在 PHP 中获取 UTC 时间

在 VBA 中,如何以简单的方式将 UTC UNIX 时间戳转换为本地时区日期?

ESP8266-通过NTP获取 Epoch/Unix(时间戳)时间

Unix 纪元时间戳在 Python 中转换为 UTC 时区