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中,两个时间是不可以直接进行比较,因为时间是由年.月.日.时.分.秒组成的,所以,如果需要将两个时间进行比较的话,我们首先要做的就是将 ...
随机推荐
- 13.用别名(alias)创建你自己的命令
现在是时候,感受第一次编程经历了!我们将用 alias 命令创建我们自己的命令.但在 开始之前,我们需要展示一个命令行小技巧.可以把多个命令放在同一行上,命令之间 用”;”分开.它像这样工作: com ...
- 排查在 Azure 中创建、重启 Windows VM 或调整其大小时发生的分配失败
创建 VM.重新启动已停止(解除分配)的 VM 和重设 VM 大小时,Azure 会为订阅分配计算资源. 执行这些操作时,即使尚未达到 Azure 订阅限制,也可能偶尔收到错误. 本文说明一些常见分配 ...
- zabbix启动报错:Connection to database 'xxx' failed解决方法
Zabbix 分布式系统监视系统 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通 ...
- Sys.WebForms.PageRequestManagerParserErrorException: 常见的原因是:通过调用Response.Write()修改相应时,将启用响应筛选器、HttpModules或服务器追踪
Sys.WebForms.PageRequestManagerParserErrorException: 无法分析从服务器收到的消息,之所以出现此错误,常见的原因是:通过调用Response.Writ ...
- [翻译] LazyFadeInView 渐入显示text文本
LazyFadeInView 渐入显示text文本 https://github.com/itouch2/LazyFadeInView LazyFadeInView is a cool way to ...
- 组合数计算-java
排列组合是计算应用经常使用的算法,通常使用递归的方式计算,但是由于n!的过于大,暴力计算很不明智.一般使用以下两种方式计算. 一,递归的思想:假设m中取n个数计算排列组合数,表示为comb(m,n). ...
- FOR YOU
给你 作者:余秀华 一家朴素的茶馆, 面前目光朴素的你皆为我喜欢 你的胡子,昨夜辗转的面色让我忧伤 我想带给你的,一路已经丢失得差不多 除了窗外凋谢的春色 遇见你以后,你不停地爱别人,一个接一个 我没 ...
- mac本机svn命令使用
公司项目用到svn,之前做版本管理用的是git. 现在对svn回顾学习了一下. 这里有一篇很好的入门教程 http://www.rubyrobot.org/tutorial/subversion-wi ...
- windows系统查看端口占用程序方法
开始---->运行---->cmd,或者是window+R组合键,调出命令窗口 输入命令:netstat -ano,列出所有端口的情况.在列表中我们观察被占用的端口,比如是49157, ...
- 环境变量、block、修饰符:block对环境变量的引用和修改需要通过修饰符来限定
环境变量.block.修饰符:block对环境变量的引用和修改需要通过修饰符来限定. http://www.cnblogs.com/fengmin/p/5816580.html - (NSUInteg ...