一文读懂 Unix 时间戳与 2038 年危机
什么是 Unix 时间戳?
Unix 时间戳(Unix Timestamp),也称为 POSIX 时间,是指从 1970 年 1 月 1 日 00:00:00 UTC(协调世界时)起至现在的总秒数(不考虑闰秒)。
它是一种在计算机系统中广泛使用的、用于表示时间的方式。
为什么选择 1970 年?
这个特定的时间点被称为 Unix Epoch(Unix 纪元)。 在早期的 Unix 系统开发时(大约 1971 年),工程师们需要一个基准点来计算时间。最初他们设定的基准点是 1971 年 1 月 1 日,并且每 1/60 秒跳动一次。但他们很快发现,如果是 32 位系统,时间很快就会溢出。
后来经过重新调整,基准点被定为了 1970 年 1 月 1 日,单位改为“秒”。这纯粹是一个为了方便当时 32 位计算机系统计算而做出的工程妥协,并没有什么特殊的历史意义。
10 位与 13 位时间戳的区别
我们在开发中经常会遇到长度不同的时间戳:
- 10 位数字:单位是秒(Seconds)。例如 PHP、Go 默认获取的时间戳。
- 13 位数字:单位是毫秒(Milliseconds)。例如 Java、JavaScript 默认获取的时间戳。
只要知道单位,它们之间只需乘以或除以 1000 即可互相转换。
Y2038 危机:时间倒流的灾难
你可能听说过 "千年虫 (Y2K)" 问题,而 Unix 时间戳也面临着自己的危机,即 2038 年问题(Y2038)。
危机是如何产生的?
在许多早期的 C 语言程序和 32 位操作系统中,时间戳被存储为一个 32 位的有符号整数(Signed 32-bit integer)。
32 位有符号整数能表示的最大正数值是:2,147,483,647。
如果我们把这个秒数加到 1970 年 1 月 1 日上,对应的时间是: 2038 年 1 月 19 日 03:14:07 UTC。
当时间超过这一刻,32 位整数就会溢出,变成一个极大的负数。对于计算机来说,这意味着时间瞬间倒流回了 1901 年 12 月 13 日!这会导致依赖该时间的数据库、安全证书、定时任务等全部崩溃。
我们得救了吗?
幸运的是,现代计算机和服务器已经大规模迁移到了 64 位操作系统。 在 64 位有符号整数下,时间戳最大可以表示到大约 2920 亿年后——这比我们宇宙的预期寿命还要长得多。所以对于现代系统,Y2038 问题已经不再是威胁。
如果您需要快速转换时间戳或查看当前时间,可以使用我们的 Unix 时间戳转换工具。