zoukankan      html  css  js  c++  java
  • PHP的strtotime()函数2038年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>';
    
        $date2a = '2038-01-19 11:14:08';
        $datetime2a = new DateTime($date2a);
        echo '2038-01-19 11:14:08 时间戳:->'.$datetime2a->format('U').'<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
    2038-01-19 11:14:08 时间戳:->2147483648
    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秒,而那个时候地球还在不在,已经不知道了。

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

  • 相关阅读:
    老齐python-基础7(文件操作、迭代)
    老齐python-基础6(循环 if while for)
    老齐python-基础5(运算符、语句)
    老齐python-基础4(元祖、字典、集合)
    老齐python-基础3(列表)
    老齐python-基础2(字符串)
    Jupyter notebook 的安装、入门
    pycharm 激活码
    VMware无法连接 MKS:套接字连接尝试次数太多正在放弃
    Numpy基本用法简介
  • 原文地址:https://www.cnblogs.com/skysowe/p/9095760.html
Copyright © 2011-2022 走看看