下面这些 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 时刻对一下,再写进任务、接口或数据库。