为什么时间戳限制在2038年?

时间:2011-05-04 05:54:46

标签: php timestamp year2038

我刚刚发现,运行日历脚本,PHP中的时间戳限制为2038.它的真正含义是什么?为什么是2038而不是2050或2039?如果时间戳只计算给定日期(1970)的秒数,为什么会有限制?

4 个答案:

答案 0 :(得分:21)

限制是由大多数C库用于表示该计数的4字节有符号整数强加的。快速数学(假设365天,不完全正确):

2147483648 seconds ~ 68.1 years

这也意味着下限〜1900。一些图书馆已经开始引入64位纪元数,但目前它们很少,而且很远。

答案 1 :(得分:20)

32位整数的最大值为2,147,483,647。如果你添加+1,你得到-2,147,483,647。从01-01-1970 00:00:00开始的2,147,483,647秒是2038年1月19日。如果再加一秒,你会在1902年的某个地方得到一个日期。

答案 2 :(得分:3)

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

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

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

例如,32位时间戳溢出发生在2038-01-19T03:14:08 + 0000Z。但是如果您处于UTC -0500时区(例如北美的EST),则溢出前的最大接受时间(对于Windows上的旧PHP版本)为2038-01-18T22:14:07-0500Z,无论你是否将它传递给mktime()或gmmktime()。“

答案 3 :(得分:1)

我的猜测是它存储在固定数量的位中,这意味着时间戳可以获得多大的限制。我们可以做一些数学计算来确切地解决它。