下面这些 Ruby 示例以 Unix 秒作为通用基准,只有在运行时天然提供毫秒的地方才展示毫秒。复制之前先回答一个简单的问题:下游那个 API 要的是什么单位?

获取当前 Unix 时间

seconds = Time.now.to_i
milliseconds = (Time.now.to_r * 1000).to_i

把时间戳转成 UTC

instant = Time.at(1_700_000_000).utc
puts instant.iso8601

上生产前留意

Time.at 接收的是 Unix 秒。一个值要被序列化成稳定的表示之前,先调 utc。

值跨越系统边界时,把单位写进字段名里:createdAtSeconds 和 createdAtMs 是比 createdAt 长了点,但出事故的时候能省下不少猜测。

Frequent questions:

Q: Time.now.to_i 返回的是毫秒吗?
A: 不是,Time.now.to_i 返回的是整数 Unix 秒。需要小数秒或者要推导毫秒时,用 Time.now.to_f。
Q: 为什么格式化之前要先调 utc?
A: 调用 utc 之后,输出就不再受本机时区影响。这对日志、API 负载和测试期望值都很有帮助。
Q: 怎么验证 Ruby 里的时间戳?
A: 用 Time.at(seconds).utc.iso8601,把结果和你预期的 UTC 时刻对一下,再写进任务、接口或数据库。