在 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,所以我会选择这个。 很高兴你测量了。 实际上,它在我的系统上失败了。 linuxdate
返回 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时间戳
在 VBA 中,如何以简单的方式将 UTC UNIX 时间戳转换为本地时区日期?