在 Lua 中获取 UTC UNIX 时间戳

Getting UTC UNIX timestamp in Lua

一个 API returns 时间戳作为 UTC 的 UNIX 时间戳,我想知道这个时间戳是否超过 x 秒前。正如预期的那样,这在 UTC 中适用于 os.time() - x > timestamp,但在其他时区会爆炸。

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

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

您可以使用

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

获取当前的 UNIX 纪元。

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

os.time(os.date("!*t"))
  1. 将获取 UTC 时间并填充 table 结构。
  2. 将根据当前时区将 table 结构转换为 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

感谢Mons at https://gist.github.com/ichramm/5674287

如果您确实需要将任何 UTC 日期转换为时间戳,在这个问题中有关于如何执行此操作的很好描述:Convert a string date to a timestamp

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 时间相同,但你和服务器的时间戳大致相同。