Unix 时间戳:计算机从 1970 年开始数秒
计算机记时间不用年月日,而是数秒:从 1970 年 1 月 1 日 00:00:00(UTC)开始,到现在过了多少秒。这个数叫 Unix 时间戳(Unix timestamp),也叫纪元时间(epoch time)。
为什么是 1970 年 1 月 1 日
这个起点叫 Unix 纪元(Unix epoch),是 Unix 的工程师随手选的:一个方便的、离当时不远的日期,够 32 位系统用一阵子。1971 年 11 月 3 日的第一版《UNIX 程序员手册》把起点定为 1971 年 1 月 1 日(以 1/60 秒计数);1970 年 1 月 1 日的纪元是后来才改定的。
时间戳的好处是简单:一个整数,没有时区、没有闰年、没有夏令时。2024 年 1 月 1 日 00:00:00(UTC)的时间戳是 1704067200——就是从 1970 年 1 月 1 日起过了 1,704,067,200 秒。程序算两个时间的差,就是两个整数相减。
时间戳只数秒,不数闰秒:Unix 时间忽略闰秒(闰秒那天,时间戳照常 +1,不多算)。所以 Unix 时间和 UTC 之间会差几个秒(27 个闰秒),但计算机不在乎。
2038 年问题:32 位整数的天花板
早期的 Unix 系统用 32 位有符号整数存时间戳,最大值是 2,147,483,647(2^31−1)。这个数在 2038 年 1 月 19 日 03:14:07(UTC)到达;再过 1 秒(03:14:08),整数溢出,变成 −2,147,483,648,系统会把它解读成 1901 年 12 月 13 日 20:45:52——时间一下子倒退约 137 年。这就是“2038 年问题”(也叫 Y2038、Y2K38、“纪元末日”)。
用无符号 32 位整数的系统晚一点出问题:最大值 4,294,967,295(2^32−1),到 2106 年才溢出。
解决办法:换成 64 位
解决办法是换成 64 位整数:64 位有符号整数能表示的时间戳够用约 2920 亿年(宇宙年龄的约 21 倍),基本等于没有上限。现代 64 位操作系统和编译器默认就用 64 位时间戳。JavaScript 的 Date 内部用 64 位浮点数存毫秒,不受影响。MySQL 的 TIMESTAMP 类型用 32 位整数(上限就是 2038 年 1 月 19 日 03:14:07),8.0.28 版(2022 年 1 月)让 UNIX_TIMESTAMP() 等函数支持 64 位(到 3001 年),但 TIMESTAMP 列类型本身仍是 4 字节、上限仍是 2038 年 1 月 19 日,要存更晚的日期得改用 DATETIME。Debian 从 2024 年起大规模迁移(time_t 出现在 6,429 个软件包里,涉及 1200 多个库),2025 年 8 月随 Debian 13 “Trixie” 发布完成切换。
真正危险的是那些很少更新的老系统和嵌入式设备:它们还在用 32 位时间戳,到 2038 年会出问题。
要点小结
Unix 时间戳是从 1970 年 1 月 1 日 00:00:00(UTC)起的秒数(忽略闰秒);起点是 Unix 工程师随手选的,1971 年 11 月 3 日第一版《UNIX 程序员手册》把起点定为 1971 年 1 月 1 日(以 1/60 秒计数),1970 年 1 月 1 日的纪元是后来才改定的;2024 年 1 月 1 日 00:00:00(UTC)= 1704067200;32 位有符号整数最大值 2,147,483,647(2^31−1),在 2038 年 1 月 19 日 03:14:07(UTC)到达,再过 1 秒溢出成 −2,147,483,648(解读为 1901 年 12 月 13 日 20:45:52,倒退约 137 年),这就是 2038 年问题(Y2038、“纪元末日”);无符号 32 位到 2106 年才溢出;64 位整数够用约 2920 亿年;MySQL TIMESTAMP 上限是 2038 年 1 月 19 日 03:14:07,8.0.28 版让 UNIX_TIMESTAMP() 等函数支持 64 位(到 3001 年),但 TIMESTAMP 列类型本身上限仍是 2038 年,要存更晚的日期得改用 DATETIME;Debian 从 2024 年起大规模迁移(time_t 出现在 6,429 个软件包里,涉及 1200 多个库),2025 年 8 月随 Debian 13 “Trixie” 发布完成切换。
相关文章
换一批- 北京时间到底从哪里来:为什么它不在北京
- 闰秒要取消了:27 个闰秒的故事与 2027 年“连续 UTC”
- 中国为什么只有一个时区
- 你的手机时间从哪来
- 二十四节气时刻为什么能精确到秒
- 农历为什么有闰月
- 原子钟怎么“数”时间
- 一天为什么不是正好 24 小时
- 夏令时:中国试过 6 年,为什么停了
- 历法辟谣:关于农历的 5 个常见误解
- 1884 年那场会议,怎么划分了全球时区
- 从日晷到原子钟:人类计时简史
- 为什么 UTC 不叫 CUT:一个字母里的外交妥协
- 海上怎么对时间?航海钟与哈里森的四十年
- 地球自转正在变慢,但最近又变快了
- 古代人怎么知道几点?打更、日晷与漏刻
- 美国为什么有 4 个时区
- 出国倒时差指南:往东飞为什么更难受
- 跨时区会议怎么约时间
- 为什么一小时是 60 分钟
- 为什么一周是 7 天
- 闰年是怎么来的
- 为什么一天从午夜开始
- 时区边界为什么不是直线
- 国际日期变更线
- 公历是怎么来的
- 钟表上的罗马数字为什么用 IIII
- 十二生肖和时间
- 收音机里的时间:授时电波
- 为什么 12 月叫 December
- 时间的单位:比秒更小
- 光钟:下一代时间标准
- 为什么有的月份 31 天、有的 30 天
- 时间感知:为什么时间有时快有时慢
- 手机时间的误差有多大
- 历史上最长的一年,为什么有 445 天
- 格林尼治天文台:世界时间的起点
- 公元元年是怎么定的
- 时间同步:全世界怎么对表
- 儒略日:天文学家给每一天编的号
- 时间的“闰”家族:闰年、闰月、闰秒
- 授时电话:打电话问时间
- 钟表发明史:从擒纵器到石英
- 为什么一天是 24 小时
- 世界时、原子时、协调世界时:三种时间,三种尺子
- 闰秒取消后会怎样
- ISO 8601:时间的国际写法
- 为什么一周从星期一开始
- 时间的度量:从秒到千年
最后更新:2026 年 11 月 6 日
事实来源:Wikipedia《Year 2038 problem》;instaconvert.app《The Year 2038 Problem, Explained》;codegenes.net《Year 2038 Bug》。