PHP的strtotime()函数2039年bug问题

最近在开发一个订单查询模块的时候,想当然的写了个2099年的日期,结果PHP返回了空值,肯定是发生溢出错误了,搜索了网上,发现下面这篇文章,但是我的问题依然没有解决,要怎么得到2038年以后的时间戳呢?

我综合了网上的资料,写了以下测试代码,应该可以解决这个问题了:

我的测试环境是:Win7 64位,PHP环境是:PhpStudy PHP5.5n

<?php

    echo 'PHP中正整形常量的最大值【PHP_INT_MAX】:'.PHP_INT_MAX.'<br>';
    echo 'PHP_INT_MAX能转换为的最大日期值:'.date("Y-m-d H:i:s", PHP_INT_MAX).'<br>';

    echo '<br>';

    $date1 = '1970-01-01 08:00:00';
    echo '1970-01-01 08:00:00 时间戳:->'.strtotime($date1).'<br>';

    $date2 = '2038-01-19 11:14:07';
    echo '2038-01-19 11:14:07 时间戳:->'.strtotime($date2).'<br>';
    
    $date3 = '2099-12-31 00:00:00';
    $datetime = new DateTime($date3);
    echo '2099-12-31 00:00:00 时间戳:->'.$datetime->format('U').'<br>';

    $date4 = '9999-12-31 23:59:59';
    $datetime = new DateTime($date4);
    echo '9999-12-31 23:59:59 时间戳:->'.$datetime->format('U').'<br>';
    
?>

PS.有关format()函数的参数,参见官方文档:http://www.php.net/manual/en/function.date.php

以上代码运行的结果:

PHP中正整形常量的最大值【PHP_INT_MAX】:2147483647
PHP_INT_MAX能转换为的最大日期值:2038-01-19 11:14:07
1970-01-01 08:00:00 时间戳:->0
2038-01-19 11:14:07 时间戳:->2147483647
2099-12-31 00:00:00 时间戳:->4102329600
9999-12-31 23:59:59 时间戳:->253402271999

由于本机的PHP_INT_MAX就是:2147483647,所以它转换为日期值,最大也就是 2038-01-19 11:14:07 ,超过哪怕一秒,也就产生了溢出。

-------------------------------------------------------------------------------------------------------------------------------------------------

以下是我找到一篇参考文章:《php时间日期处理到2038年之后该怎么办?》

原文地址:https://blog.csdn.net/qiminghang/article/details/52994814

网上搜罗的解决方案大多是:

1.不用担心,到2038年之后你的系统都不知道升级多少次了,那个时候肯定有解决办法。

2.php是开源的,你们可以修改代码重新编译

3.使用DateTime类。。。

4.使用64位操作系统

个人觉得使用64位操作系统还是比较根本的解决办法。于是测试了下windows 7 64bit安装wamp测试,代码如下:

<?php  
    $time = strtotime('9999-12-31');  
    echo $time . '<br>';  
    echo date("Y-m-d",$time);  
?>  

结果输出:1970-1-1

难道64位系统不能解决该问题?

于是,将刚才的代码放到一台centos 6.6 x64操作系统,php5.3环境的云服务器上再次测试运行,输出下面的结果:

4094467200

2099-10-1

什么?你觉得不过瘾?9999年?,好,我们来试一下,将上面的代码修改一下

<?php  
    $time = strtotime('9999-12-31');  
    echo $time . '<br>';  
    echo date("Y-m-d",$time);  
?>  

还是centos 6.6 x64版本+php5.3的环境,运行,输出结果如下:

253402185600
9999-12-31

应该够用了,64位操作系统可以表示到292,277,026,596年12月4日15时30分08秒,而那个时候地球还在不在,已经不知道了。

纠结了好久的问题,终于还是不算啥问题。

猜你喜欢

转载自www.cnblogs.com/skysowe/p/9095760.html
今日推荐