Files
2026-07-13 12:32:21 +08:00

78 lines
2.4 KiB
Lua

--- Module for timestamp support.
-- Based on the LuaTZ module.
-- @copyright Copyright 2016-2023 Kong Inc. All rights reserved.
-- @license [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-- @module kong.tools.timestamp
local luatz = require "luatz"
local tz_time = luatz.time
local tt_from_timestamp = luatz.timetable.new_from_timestamp
local tt = luatz.timetable.new
local math_floor = math.floor
local tablex = require "pl.tablex"
--- Current UTC time
-- @return UTC time in milliseconds since epoch, but with SECOND precision.
local function get_utc()
return math_floor(tz_time()) * 1000
end
--- Current UTC time
-- @return UTC time in milliseconds since epoch.
local function get_utc_ms()
return tz_time() * 1000
end
-- setup a validation value, any value above this is assumed to be in MS
-- instead of S (a year value beyond the year 20000), it assumes current times
-- as in 2016 and later.
local ms_check = tt(20000 , 1 , 1 , 0 , 0 , 0):timestamp()
-- Returns a time-table.
-- @param now (optional) time to generate the time-table from. If omitted
-- current utc will be used. It can be specified either in seconds or
-- milliseconds, it will be converted automatically.
local function get_timetable(now)
local timestamp = now and now or get_utc()
if timestamp > ms_check then
return tt_from_timestamp(timestamp/1000)
end
return tt_from_timestamp(timestamp)
end
--- Creates a timestamp table containing time by different precision levels.
-- @param now (optional) Time to generate timestamps from, if omitted current UTC time will be used
-- @return Timestamp table containing fields/precisions; second, minute, hour, day, month, year
local function get_timestamps(now)
local timetable = get_timetable(now)
local stamps = {}
timetable.sec = math_floor(timetable.sec) -- reduce to second precision
stamps.second = timetable:timestamp() * 1000
timetable.sec = 0
stamps.minute = timetable:timestamp() * 1000
timetable.min = 0
stamps.hour = timetable:timestamp() * 1000
timetable.hour = 0
stamps.day = timetable:timestamp() * 1000
timetable.day = 1
stamps.month = timetable:timestamp() * 1000
timetable.month = 1
stamps.year = timetable:timestamp() * 1000
return stamps
end
return {
get_utc = get_utc,
get_utc_ms = get_utc_ms,
get_timetable = get_timetable,
get_timestamps = get_timestamps,
timestamp_table_fields = tablex.readonly({"second", "minute", "hour", "day", "month", "year"})
}