在 Tarantool 中处理日期的正确方法是什么?

What is the correct way to work with dates in Tarantool?

Tarantool中有几种获取时间的方法:

但是处理日期的正确方法是什么?

这取决于你的任务。

如果使用 timezones/formats 等操作对您很重要。 我建议使用 icu-data library (https://github.com/tarantool/icu-date)

首先,Unix epoch有几个套路:

  1. os.time() — 经典的 Lua 时间函数。有点慢而且效率不高。不建议在 tarantool 内部使用来获取当前纪元,但当然可以。可用于获取任意日期的纪元(在本地时区内)。例如:
os.time({ year = 2020, month = 6, day = 4 })

将产生 1591261200,在我的 GMT+3 时区 12:00:00

  1. clock.time()(和 clock.time64())— 高分辨率计时器,几乎原始绑定到 clock_gettime。更多信息可以从 doc
  2. 获取
  3. fiber.time()(以及 fiber.time64())— clock.time 的缓存版本。更新了每个事件循环迭代。如果不需要时钟的绝对精度,建议使用。

要将纪元转换为不同的格式和时区,有以下变体:

  1. os.date("<format>" [, epoch ]) — 将纪元转换为本地时区。
  2. os.date("!<format>" [, epoch ])(注意 ! 前缀)——将纪元转换为 GMT 时区。
  3. 为了获取 table 日期的组成部分,我们可以对本地使用 os.date('*t'),对 UTC 使用 os.date('!*t')
  4. icu-date 可能会被认为您需要使用不同的时区 and/or 格式。

比如需要UTC时间,使用缓存的fiber.timeos.date:

就可以了
local fiber = require 'fiber'
os.date("!%Y-%m-%dT%H:%M:%SZ", fiber.time())

将 return 类似 2020-06-04T11:48:54Z 独立于时区