在 Tarantool 中处理日期的正确方法是什么?
What is the correct way to work with dates in Tarantool?
在Tarantool
中有几种获取时间的方法:
- 使用
clock
模块
- 使用
fiber.time
函数
- 使用
os.date
但是处理日期的正确方法是什么?
这取决于你的任务。
如果使用 timezones/formats 等操作对您很重要。
我建议使用 icu-data library (https://github.com/tarantool/icu-date)
首先,Unix epoch有几个套路:
os.time()
— 经典的 Lua 时间函数。有点慢而且效率不高。不建议在 tarantool 内部使用来获取当前纪元,但当然可以。可用于获取任意日期的纪元(在本地时区内)。例如:
os.time({ year = 2020, month = 6, day = 4 })
将产生 1591261200
,在我的 GMT+3 时区 12:00:00
clock.time()
(和 clock.time64()
)— 高分辨率计时器,几乎原始绑定到 clock_gettime
。更多信息可以从 doc 获取
fiber.time()
(以及 fiber.time64()
)— clock.time 的缓存版本。更新了每个事件循环迭代。如果不需要时钟的绝对精度,建议使用。
要将纪元转换为不同的格式和时区,有以下变体:
os.date("<format>" [, epoch ])
— 将纪元转换为本地时区。
os.date("!<format>" [, epoch ])
(注意 !
前缀)——将纪元转换为 GMT 时区。
- 为了获取 table 日期的组成部分,我们可以对本地使用
os.date('*t')
,对 UTC 使用 os.date('!*t')
icu-date
可能会被认为您需要使用不同的时区 and/or 格式。
比如需要UTC时间,使用缓存的fiber.time
和os.date
:
就可以了
local fiber = require 'fiber'
os.date("!%Y-%m-%dT%H:%M:%SZ", fiber.time())
将 return 类似 2020-06-04T11:48:54Z
独立于时区
在Tarantool
中有几种获取时间的方法:
- 使用
clock
模块 - 使用
fiber.time
函数 - 使用
os.date
但是处理日期的正确方法是什么?
这取决于你的任务。
如果使用 timezones/formats 等操作对您很重要。 我建议使用 icu-data library (https://github.com/tarantool/icu-date)
首先,Unix epoch有几个套路:
os.time()
— 经典的 Lua 时间函数。有点慢而且效率不高。不建议在 tarantool 内部使用来获取当前纪元,但当然可以。可用于获取任意日期的纪元(在本地时区内)。例如:
os.time({ year = 2020, month = 6, day = 4 })
将产生 1591261200
,在我的 GMT+3 时区 12:00:00
clock.time()
(和clock.time64()
)— 高分辨率计时器,几乎原始绑定到clock_gettime
。更多信息可以从 doc 获取
fiber.time()
(以及fiber.time64()
)— clock.time 的缓存版本。更新了每个事件循环迭代。如果不需要时钟的绝对精度,建议使用。
要将纪元转换为不同的格式和时区,有以下变体:
os.date("<format>" [, epoch ])
— 将纪元转换为本地时区。os.date("!<format>" [, epoch ])
(注意!
前缀)——将纪元转换为 GMT 时区。- 为了获取 table 日期的组成部分,我们可以对本地使用
os.date('*t')
,对 UTC 使用os.date('!*t')
icu-date
可能会被认为您需要使用不同的时区 and/or 格式。
比如需要UTC时间,使用缓存的fiber.time
和os.date
:
local fiber = require 'fiber'
os.date("!%Y-%m-%dT%H:%M:%SZ", fiber.time())
将 return 类似 2020-06-04T11:48:54Z
独立于时区