在 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"))
- 将获取 UTC 时间并填充 table 结构。
- 将根据当前时区将 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 时间相同,但你和服务器的时间戳大致相同。
一个 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"))
- 将获取 UTC 时间并填充 table 结构。
- 将根据当前时区将 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 时间相同,但你和服务器的时间戳大致相同。