【问题标题】:Maximum time() | PHP最大时间() | PHP
【发布时间】:2011-04-26 14:00:06
【问题描述】:

这是一个愚蠢的问题,但是 time() 的最大 INT 值是多少,它是未来的日期,例如

2999 年 1 月 1 日

time() 会达到那个值吗?选择较大的 time() 值将返回:

1970 年 1 月 1 日星期四凌晨 1:00

一个普通的 int 日期

1287320788 - 输出今天的日期:2010 年 10 月 17 日星期日下午 2:06

但我只对最大 int 日期和最后日期感到好奇。

【问题讨论】:

  • 该链接在 PHP 方面也有很好的背景信息
  • 最近在 PHP 的 time() 中修复了吗?现在它可以产生的最大价值是9223372036854772207 (04.12.292277026596 15:30:07)(非常接近 64 位整数最大值)

标签: php datetime date time


【解决方案1】:

最后一个 32 位整数时间戳将在 2038 年 1 月 19 日到达。这称为Year 2038 problem

【讨论】:

  • 感谢 Pekka。一旦我们接近它,这个问题会得到解决吗?
  • @YouBook 如果那时 PHP 仍然存在,可能。通过将底层系统切换到更大的 INT 将很容易修复 - 由于 PHP 的弱类型化,这不会是什么大问题。或者,按照 Gordon 的建议使用 DateTime
  • 基本上问题会根据定义自行解决,因为 2038 年是 32 位系统中的最大 int 并且大多数计算机已经是 64 位,这意味着整数范围更广......
【解决方案2】:

PHP 将它可以表示的最大整数存储在PHP_INT_MAX 常量中:

date('Y-m-d H:i:s', PHP_INT_MAX); // 2038-01-19 04:14:07

如果您想使用超出此日期的日期,请考虑使用 DateTime API,例如

$dt = new DateTime('1st January 2999');
$dt->add(DateInterval::createFromDateString('+1 day'));
echo $dt->format('Y-m-d H:i:s'); // 2999-01-02 00:00:00
echo $dt->format('U');           // 32472226800

【讨论】:

  • 是的,使用 DateTime 和 - 在 mySQL 方面 - DATETIME 字段类型完全解决了这个问题。
【解决方案3】:

请记住,Y2038 问题不适用于 64 位系统。

【讨论】:

  • 嗯,你确定吗? PHP 对整数的内部处理会自动转为 64 位吗?
  • 我不太确定,但它似乎在我的盒子上翻滚... :-)
  • 64 位在接下来的约 3000 亿年中将没问题。
  • 小心。 Y2038 问题始终适用于 Windows 系统。 “64 位平台的最大值通常约为 9E18,Windows 除外,它始终为 32 位。” php.net/manual/en/language.types.integer.php
  • 好吧,如果我没记错的话,Window 上的 XAMPP 即使在 64 位机器上仍然使用 32 位整数。
【解决方案4】:

我知道的最短方法是获取明天的日期:

date("Y-n-j", strtotime("+1 天"))

date("Y-n-j", PHP_INT_MAX) 在 64 位系统上提供潜在的危险值:292277026596-12-4

【讨论】:

    【解决方案5】:

    DateTime 似乎也在 64 位服务器上使用 32 位。 所以你会遇到麻烦。

    我是这样解决的:

    new DateTime("99999/12/31 00:00:00");
    

    由于日期超出了 DateTime 的最大长度,日期使用最大可能值并返回一个 DateTime 对象,如下所示(使用 var_dump 检查):

    object(DateTime)#9 (3) { ["date"]=> string(19) "2031-09-12 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Berlin" } }
    

    我不确定它是否与 PHP 的版本不同。我已经用 5.4 版本对其进行了测试。

    【讨论】:

      【解决方案6】:

      在 64 位平台上 PHP_INT_MAX 不反映 32 位平台的最大 INT 值。获取方法如下:

      $max32bitInt = PHP_INT_SIZE == 4 ? PHP_INT_MAX : PHP_INT_MAX>>32;
      

      如果您一直使用 64 位平台,请使用:

      PHP_INT_MAX>>32
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 2012-06-28
        • 1970-01-01
        • 2011-02-10
        • 2019-08-03
        • 1970-01-01
        相关资源
        最近更新 更多