33

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

4

4 回答 4

28

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

2147483648 seconds ~ 68.1 years

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

于 2011-05-04T05:58:57.910 回答
27

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

于 2011-05-04T06:01:23.143 回答
3

由于 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()。”

于 2011-05-04T05:57:04.713 回答
-1

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

于 2011-05-04T05:57:19.190 回答