我刚刚发现,运行日历脚本,PHP中的时间戳限制为2038.它的真正含义是什么?为什么是2038而不是2050或2039?如果时间戳只计算给定日期(1970)的秒数,为什么会有限制?
答案 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)
我的猜测是它存储在固定数量的位中,这意味着时间戳可以获得多大的限制。我们可以做一些数学计算来确切地解决它。