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” 发布完成切换。

相关文章

换一批

最后更新:2026 年 11 月 6 日
事实来源:Wikipedia《Year 2038 problem》;instaconvert.app《The Year 2038 Problem, Explained》;codegenes.net《Year 2038 Bug》。

← 返回首页 · 时间知识 →