指南 / 基础

什么是 Unix 时间戳?

准确理解 Unix 纪元、UTC、负数时间戳、常见单位,以及一个 epoch 数值真正标识什么。

简明定义

Unix 时间戳是从 1970-01-01T00:00:00Z 起经过时间的有符号计数。经典定义使用秒,但现代 API 也使用毫秒、微秒和纳秒,因此一个没有单位的数字并不完整。

时间戳 0 就是 Unix 纪元;-1 秒是 1969-12-31T23:59:59Z。只要运行环境和存储类型支持,负数时间戳完全有效。

UTC 与时区

时间戳标识 UTC 时间线上的一个绝对时刻,不携带城市、国家、夏令时规则或首选显示格式。同一数值在上海和纽约会显示成不同钟点,但仍然是同一时刻。

闰秒

Unix 时间通常把每一天按 86,400 秒处理,不把闰秒编码为单独的编号秒。对常见 Web、API 和数据库工作,这是预期规则;科学计时系统可能采用其他时间尺度。

可复现示例

1700000000 秒转换为 2023-11-14T22:13:20.000Z。乘以 1,000 得到 1700000000000 毫秒,单位改变但时刻不变。

从 API 或日志读取时间戳

created_at 这样的字段可能保存 ISO 字符串、Unix 秒或毫秒,仅凭字段名不能确定格式。先查看接口文档,再把数值放入时间戳转日期工具,明确选择单位。核对 UTC 日期是否符合事件发生时间后,再复制结果。

Unix 秒UTC 日期含义
-11969-12-31 23:59:59纪元前一秒
01970-01-01 00:00:00Unix 纪元起点
17000000002023-11-14 22:13:20常见的现代时间戳
21474836472038-01-19 03:14:07有符号 32 位秒数上限

同一时刻为什么会显示不同日期?

1700000000 在 UTC 是 11 月 14 日 22:13:20,在上海是 11 月 15 日 06:13:20,在纽约是 11 月 14 日 17:13:20。时间戳数值没有变化,变化的是时区下的日历表示。可在时间戳时区工具核对这些结果。

常见 POSIX 时间戳不会把闰秒作为额外的普通秒计入,因此它并不是精确的原子钟计数。设备时钟也可能被系统校时修正。测量一段程序的运行耗时,应使用 JavaScript 的 performance.now() 等单调时钟,而不是简单相减两次设备日期。

保存数值时也保存单位约定

数据库字段或 API 文档应注明秒、毫秒、微秒还是纳秒。日期看起来异常时,先阅读秒与毫秒的区别,不要直接补零尝试。如果手里的输入是某地区的日历日期,应使用日期转时间戳,并写明来源时区。

标准与运行时参考

工具 / 01—06

更多时间戳工具

每个工具都从明确的输入出发,给出明确的结果。