简明定义
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 日期 | 含义 |
|---|---|---|
-1 | 1969-12-31 23:59:59 | 纪元前一秒 |
0 | 1970-01-01 00:00:00 | Unix 纪元起点 |
1700000000 | 2023-11-14 22:13:20 | 常见的现代时间戳 |
2147483647 | 2038-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 文档应注明秒、毫秒、微秒还是纳秒。日期看起来异常时,先阅读秒与毫秒的区别,不要直接补零尝试。如果手里的输入是某地区的日历日期,应使用日期转时间戳,并写明来源时区。