【发布时间】:2011-08-18 06:16:30
【问题描述】:
我刚刚在运行日历脚本时发现,PHP 中的时间戳限制为 2038。这到底是什么意思?为什么是 2038 而不是 2050 或 2039?如果时间戳只计算给定日期(1970 年)的秒数,为什么要限制?
【问题讨论】:
-
@muistooshort 哈哈哈,当我读到这篇文章时,这正是我的想法。 “哦哦。我们都会死的。”
我刚刚在运行日历脚本时发现,PHP 中的时间戳限制为 2038。这到底是什么意思?为什么是 2038 而不是 2050 或 2039?如果时间戳只计算给定日期(1970 年)的秒数,为什么要限制?
【问题讨论】:
限制是由大多数 C 库用于表示该计数的 4 字节有符号整数强加的。快速数学(假设 365 天年,不完全正确):
2147483648 seconds ~ 68.1 years
这也意味着下限约为 1900。一些库已经开始引入 64 位 epoch 计数,但目前还很少。
【讨论】:
32 位整数的最大值为 2,147,483,647。如果你加上 +1,你会得到 -2,147,483,647。从 01-01-1970 00:00:00 算起的 2,147,483,647 秒是 2038 年 1 月 19 日。如果再增加一秒,就会得到 1902 年某处的日期。
【讨论】:
由于 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()。"
【讨论】:
我的猜测是它存储在固定数量的位中,这意味着时间戳可以得到多大的限制。我们可以做一些数学来弄清楚。
【讨论】: