在Lua中将时间戳转换为ISO 8601格式

14

如何在Lua中将时间戳转换为ISO 8601格式(例如2009-01-28T21:49:59.000Z)?

我特别想使用Nginx中的HttpLuaModule来实现。

3个回答

26

如果t是自纪元以来的秒数,则尝试os.date(“!%Y-%m-%dT%TZ”)os.date(“!%Y-%m-%dT%TZ”,t)


3
除了“%M”应该是小写的“%m”之外,这个方法是可行的。回答已更新。 - Mark
5
这段话意思是,在Windows系统上的Lua 5.3.4版本中,该方法无法正常运行,会报错:bad argument #1 to 'date' (invalid conversion specifier '%TZ')。修复后的版本为:os.date("!%Y-%m-%dT%H:%M:%SZ") - Phrogz

1

您要求包含毫秒,因为os.date格式不允许毫秒,所以需要进行一些技巧。
在运行Nginx时(这是您提出问题的上下文),此方法有效。

-- Return a ISO 8061 formatted timestamp in UTC (Z)
-- @return e.g. 2021-09-21T15:20:44.323Z
local function iso_8061_timestamp()
    local now = ngx.now()                               -- 1632237644.324
    local ms = math.floor((now % 1) * 1000)             -- 323 or 324 (rounding)
    local epochSeconds = math.floor(now)
    return os.date("!%Y-%m-%dT%T", epochSeconds) .. "." .. ms .. "Z"  -- 2021-09-21T15:20:44.323Z
end

请注意这里有一个有用的日期格式参考:https://developpaper.com/lua-os-date-notes/

-1

或者你可以使用:

local now_date_time = os.date("!%Y%m%dT%H%M%S") --> For date_time: 20191015T042028Z

local now_date = os.date("!%Y%m%d") --> For only date: 20191015

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