为什么时间戳有2038年的限制?


Why do timestamps have a limit to 2038?

我刚刚发现,运行一个日历脚本,PHP中的时间戳限制为2038。这到底是什么意思?为什么是2038年,而不是2050年或2039年?如果时间戳只是从给定日期(1970年)开始计算秒数,为什么要限制呢?

这个限制是由大多数C库用来表示该计数的4字节有符号整数施加的。快速计算(假设一年365天,不完全正确):

2147483648 seconds ~ 68.1 years

这也意味着~1900的下限。一些库已经开始引入64位epoch计数,但目前还很少。

有符号32位整数的最大值为2,147,483,647。如果再加1,就得到- 2147483647。2038年1月19日00:00:00为2038年1月19日。如果你再加一秒,你就会得到1902年的某个日期。

由于32位机器INT数据类型的限制

http://php.net/manual/en/function.mktime.php

From php.net:" mktime()和gmmktime()接受的最大可能日期取决于当前位置的时区。

例如,32位时间戳溢出发生在20388-01-19 t03:14:08 +0000Z。但是,如果您处于UTC -0500时区(例如北美的EST),则无论将其传递给mktime()还是gmmktime(),在溢出之前接受的最大时间(对于Windows上的旧PHP版本)都是20388-01-18 t22:14:07- 0500z。"

我猜它是以固定位数存储的,这意味着对时间戳的大小有限制。我们可以算一下。