在Lua中获取UTC UNIX时间戳

17

一个API会以UNIX时间戳的UTC格式返回时间戳,我想知道这个时间戳是不是在 x 秒之前。在UTC中,os.time() - x > timestamp 可以正常工作,但在其他时区则会出错。

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

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

3个回答

19
你可以使用os.time(os.date("!*t"))来获取当前的UNIX纪元。

哦,这很有道理。我之前尝试过反过来做,但是它没有产生任何有用的结果! - Azsgy
3
性能说明:这种方法大约比使用os.time()并减去差异慢500倍。但是,因为我预期这种方法会出现错误,并且预计最大消息/秒将在200左右,所以我会使用这种方法。 - Azsgy
很高兴你进行了测量。 - Joe
4
实际上,在我的系统上运行失败了。Linux的date命令返回14:40,date -u命令返回12:40,但Lua的os.time(os.date("!*t"))命令返回1562240400,对应于13:40。因此,似乎存在时区/夏令时问题。 - galinette
1
os.time(os.date("*t")) 可以避免夏令时问题。 - redfast00

6

好的,你想要获取UTC时间。请记住,os.time实际上不知道时区,因此例如:

os.time(os.date("!*t"))
  1. 将获取UTC时间并填充表结构。
  2. 将表结构根据当前时区转换为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日期转换为时间戳,可以在这个问题中找到一个很好的描述:将字符串日期转换为时间戳


0

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时间不同。也可以在在线repl上运行。服务器的本地时间和UTC时间相同,但你和服务器的时间戳大约是一样的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接