【问题标题】:Getting UTC UNIX timestamp in Lua在 Lua 中获取 UTC UNIX 时间戳
【发布时间】: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 编译时选项引起的,但由于解释器是由用户提供的,因此无法更改这些选项。

【问题讨论】:

    标签: datetime time lua timestamp strftime


    【解决方案1】:

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

    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 日期转换为时间戳,请在此问题中很好地说明如何执行此操作: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")) 没有夏令时问题
        猜你喜欢
        • 1970-01-01
        • 2012-11-11
        • 2013-03-20
        • 1970-01-01
        • 2015-01-08
        • 2014-03-31
        • 2013-07-20
        • 2020-10-22
        • 1970-01-01
        相关资源
        最近更新 更多