我刚刚发现,运行日历脚本,PHP 中的时间戳限制为 2038。这到底是什么意思?为什么是 2038 而不是 2050 或 2039?如果时间戳只计算给定日期(1970 年)的秒数,为什么要限制?
4 回答
该限制是由大多数 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 年某处的日期。
由于 INT 数据类型在 32 位机器上的限制
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()。”
我的猜测是它存储在固定数量的位中,这意味着时间戳可以得到多大的限制。我们可以做一些数学来准确地计算出来。