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中,两个时间是不可以直接进行比较,因为时间是由年.月.日.时.分.秒组成的,所以,如果需要将两个时间进行比较的话,我们首先要做的就是将 ...
随机推荐
- 关于hashcode 里面 使用31 系数的问题
首先我们来了解一下hashcode,什么是hashcode?有什么作用? hashcode其实就是散列码,使用hashcode使用高效率的哈希算法来定位查找对象! 我们在使用容器来存储数据的时候会计算 ...
- 随手记C#资料
1.where T: new()where后的称为泛型约束,这里约束泛型参数T必须具有无参的构造函数 2.判断路径是本地路径还是网址 private static bool IsLocalPath(s ...
- 第一课 PPT 所学内容总结
制作PPT时要注意三要素即:图形,颜色搭配,字数适当. 感悟:制作一个好的PPT也并不需要华丽的画面.只需清晰的表达出自己想要表达的,就是一个好PPT.
- C指针和数组
一.指针 指针就是地址,指针变量是用来存放地址的变量,把谁的地址存放在指针变量中,就说此指针变量指向谁. 二.数组 1.一维数组 一维数组名代表数组首元素的地址,因此 *a=a[0]; &:取 ...
- [EffectiveC++]item41:了解隐式接口和编译期多态
- echarts仪表盘配置参数
require.config({ paths:{ echarts:"js/chart" } }); require([ 'echarts', 'echarts/chart/gaug ...
- Mac下的mongodb安装
mac下的mongodb安装主要有两种方式,一是手工安装,需在官网下载源文件,二是通过homebrew,至于homebrew不做介绍.既然是Mac系统下,我认为直接通过homebrew安装最好,省事还 ...
- Failed to read Class-Path attribute from manifest of jar file:/XXX问题
java.lang.IllegalStateException: Failed to read Class-Path attribute from manifest of jar file:/XXX ...
- 超慢速移动动画使用CSS3实现流畅效果
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVpbGVpZm9yZXZlcg==/font/5a6L5L2T/fontsize/400/fill/I0 ...
- Java并发案例03---生产者消费者问题02
生产者消费者第二种情形 package com.maple.msb.one; public class ProducerConsumer { public static void main(Strin ...