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
也是无意之间发现的一个问题,因为php的时间处理使用UNIX时间戳,也就是他能够表示的日期范围是1970 年 1 月 1 日到 2038 年 1 月 19 日,那么超过这个范围怎么办呢?比如2039年?
网上搜罗的解决方案大多是:
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秒,而那个时候地球还在不在,已经不知道了。
纠结了好久的问题,终于还是不算啥问题。
PHP的strtotime()函数2038年bug问题的更多相关文章
- C#时间转整型(时间戳),模仿php strtotime函数的部分功能
今天需要将一个基于MS SQL数据库的新闻系统数据导入phpcms v9,源系统新闻日期格式为"2014-01-15 10:45:49",而phpcms中使用的是整型时间戳,在ph ...
- PHP中strtotime函数使用方法分享
在PHP中有个叫做strtotime的函数.strtotime 实现功能:获取某个日期的时间戳,或获取某个时间的时间戳.strtotime 将任何英文文本的日期时间描述解析为Unix时间戳[将系统时间 ...
- 谨慎使用php的strtotime()函数
我们在日常业务中,针对业务量,经常会采用对数据库按时间做横向分表,分表后的查询往往会涉及到时间问题.例如,我们想查询某个用户距离当前时间1个月的订单情况,在这个时候,我们有些会用到strtotime( ...
- (转载)PHP strtotime函数详解
(转载)http://www.jb51.net/article/21495.htm strtotime函数是一个很好的函数,灵活的运用它,会给你的工作带来不少方便.但PHP的手册中却对此函数的参数没作 ...
- ASP无惧上传类不能上传中文双引号文件及ASP函数InStr存在bug
ASP无惧上传类不能上传中文双引号文件及ASP函数InStr存在bug 近日发现eWebEditor V2.8 asp 版本上传文件文件名不能包含中文双引号,发现eWebEditor使用ASP“无惧上 ...
- 0.11内核rd_load@ramdisk.c中memcpy函数好像有bug
0.11内核rd_load@ramdisk.c中memcpy函数好像有bug,如:#define memcpy(dst,src,n) \ __asm__("cld;rep;movsl& ...
- php中的date和strtotime函数妙用
php中的两个常用的日期相关函数date和strtotime,相信大家一定不陌生.但我们平时使用都只是基本功能,什么时间戳变日期格式,日期格式变时间戳. 其实这两个函数还有更深的用法: 1.date函 ...
- [20191002]函数dump的bug.txt
[20191002]函数dump的bug.txt --//前几天写raw转化oracle number脚本,在使用函数dump时遇到一些问题,做一个记录:--//oracle number 0 编码 ...
- PHP用strtotime()函数比较两个时间的大小实例详解
在PHP开发中,我们经常会对两个时间的大小进行判断,但是,在PHP中,两个时间是不可以直接进行比较,因为时间是由年.月.日.时.分.秒组成的,所以,如果需要将两个时间进行比较的话,我们首先要做的就是将 ...
随机推荐
- 解决linux-mysql 登录时,报异常:Access denied for user 'root'@'localhost'
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/hhj724/article/details/73277506 解决linux-mysql 登录时,报 ...
- Asp.Net MVC Identity 2.2.1 使用技巧(三)
使用用户管理器之用户注册 用户管理的基本功能模块中已经做好了,我们现在做一些调整. 1.修改用户名注册规则. 上一篇中可选操作已经详解了这里把基本的设置简介下. 打开App_Start/identit ...
- CentOS 7 安装Rabbitmq
第一步也是往往最重要的一步:下载安装包! Rabbitmq地址:https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.5 Erla ...
- 错误:该表单无法显示,可能是由于 Microsoft SharePoint Server State Service 配置不当。有关详细信息,请与服务器管理员联系
问题场景: 1.SharePoint 2013 中工作流需要状态服务(State Service),如果没有正确配置状态服务,则在给列表.文档库添加工作流时会遇到错误: “该表单无法显示,可能是由于 ...
- Entity Framework:代码优先
一.代码优先Code First EF6支持Oracle ODT 12C Release 3 (net4.5) DataModel(类)-->生成数据库DB 或 存在的数据库DB-->生成 ...
- codeforces 549F Yura and Developers(分治、启发式合并)
codeforces 549F Yura and Developers 题意 给定一个数组,问有多少区间满足:去掉最大值之后,和是k的倍数. 题解 分治,对于一个区间,找出最大值之后,分成两个区间. ...
- Python 及其基础语法
重新开始玩 Python,打算就是学完实验楼的"Python3 简明教程",然后就可以玩点小项目,先前学了点 Python2 就不管它啦. 以上. 认识 Python Python ...
- Tomcat的HTTPS配置及HTTP自动跳转配置
1.生成证书 (1)在jdk的安装目录\bin\keytool.exe下打开keytool.exe 在命令行中输入以下命令: keytool -genkeypair -alias 以上命令将生产一对非 ...
- Linux性能测试工具
Linux性能测试工具 在测试中,我们不仅需要查看系统日志信息,而且还要使用大量的性能监测工具来关注某些地方,如内存.CPU等.在Linux系统中,所有的运行参数保存在虚拟目录/proc中,换句话说, ...
- PL\SQL Developer连接本地Oracle 11g数据库
1.登录PL/SQL Developer 这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files ...