前言

最近在写一个项目接口。测试中发现服务器上测试正常的功能,在本地一直有问题。一步步的排查,最终锁定问题是由于函数strtotime返回了一个false值,导致数据插入数据库失败。

相同代码运行结果不一样,原因那就是环境不一致导致。要么是PHP版本不同,要么是位数不同。

我电脑是64位的。这里是PHP位数不一致,服务器使用64位,而我本地是32位。而strtotime被传入了一个字符串2050-1-1 23:59:59,该参数大于了2038-1-19 03:14:07所以在32位PHP下直接返回false,而64位PHP不受影响。

Y2K38漏洞

导致上述问题的根本原因就是Y2K38漏洞,也被称为Unix Millennium Bug。

32位系统或PHP

此漏洞将会影响到所有 32 位系统下用UNIX 时间戳整数来记录时间的 PHP,及其它编程语言。一个整型的变量所能保存的最大时间为 2038 年01月19 日 03:14:07。超过这个时间后,整型数值将会溢出。

64位系统或PHP

64位系统下可以保存的日期最远日期是现在宇宙年龄的21倍——292亿年。所以不会受到该漏洞影响。

如何检测

如何知道你的系统是否收到该漏洞的影响。很简单,直接使用strtotime去转换一个大于2038年1月19日03:14:07日期。或者使用date函数将一个大于2147454847时间戳转换为日期。

下面具体演示一下

方法一

echo date("Y-m-d H:i:s",2556115199);

上面结果如果返回2050-12-31 23:59:59那么就没有问题。如果返回1914-11-25 09:31:43那么就受收到影响。

方法二

var_dump(strtotime("2050-12-31 23:59:59"));

上面结果如果返回2556115199那么就正常。如果返回false那么也会受到影响。

解决方案

方案一

更换系统和PHP均为64位。这个代价比较大,但是可以永久解决问题。

方案二

PHP5.2版本之后提供了一个函数DateTime可以临时解决一下问题。

// 1、日期字符串转换为时间戳

$obj = new DateTime("2050-12-31 23:59:59");

echo $obj->format("U"); // 2556115199

// 2、时间戳转换为日期字符串

$obj = new DateTime("@2556115199"); // 这里时间戳前要写一个@符号

$timezone = timezone_open('Asia/HONG_KONG'); // 设置时区

$obj->setTimezone($timezone);

echo $obj->format("Y-m-d H:i:s"); // 2050-12-31 23:59:59

// 而且DateTime还可以有其他玩法

$obj = new DateTime("2050-12-31 23:59:59");

echo $obj->format("Y/m/d H:i:s"); // 换种方式输入时间字符串2050/12/31 23:59:59

通过DateTime类来操作日期不会受到Y2K38漏洞的影响,可以最远支持到9999年12月31日

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

mysql 2038年问题_关于PHP转换超过2038年日期出错的问题解决相关推荐

  1. mysql 2038年问题_时间戳(UnixTimestamp)与 《2038年问题》

    时间戳是从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. 现在时间戳的长度是十位(1435113975--2015/6/24 ...

  2. php解决时间2038问题,PHP实例:关于PHP转换超过2038年日期出错的问题解决

    <PHP实例:关于PHP转换超过2038年日期出错的问题解决>要点: 本文介绍了PHP实例:关于PHP转换超过2038年日期出错的问题解决,希望对您有用.如果有疑问,可以联系我们. 前言 ...

  3. mysql 2038年问题_当前系统在2038年之后datetime类也无法获取当前时间的解决

    由于php 32位使用 int 类型保存时间戳,也就是从1970 00:00:00 到当前时间的秒数. 而32位int 数字的取值范围是 -2147483648 到 2147483647. 所以当 时 ...

  4. php显示2038年,PHP转换超过2038年日期出错如何解决

    我电脑是64位的.这里是PHP位数不一致,服务器使用64位,而我本地是32位.而strtotime被传入了一个字符串2050-1-1 23:59:59,该参数大于了2038-1-19 03:14:07 ...

  5. php 2038,PHP转换超过2038年的日期出错问题解决

    最近在写一个项目接口.测试中发现服务器上测试正常的功能,在本地一直有问题.一步步的排查,最终锁定问题是由于函数strtotime返回了一个false值,导致数据插入数据库失败. 相同代码运行结果不一样 ...

  6. 2038年问题 php,php strtotime() mktime() 的2038年问题 Y2K38漏洞

    Y2K38 漏洞是什么? Y2K38,又称 Unix Millennium Bug, 这个漏洞将会影响到所有 32 位系统下用 UNIX 时间戳整数来记录时间的 PHP,及其它编程语言.一个整型的变量 ...

  7. 2038年问题 linux内核5.6,Linux Kernel 5.6 开发者已准备好应对 2038 年问题

    2038 年问题与千年虫问题类似,它可能会导致某些软件在 2038 年 1 月 19 日 3 时 14 分 07 秒之后无法正常工作.届时,在大部分 32 位操作系统上,依据 "time_t ...

  8. 2038年问题 linux内核5.6,Linux Kernel 5.6 开发者已率先做好准备 应对 2038 年问题

    新十年伊始,Linux Kernel 5.6的开发者已经准备好着手解决将在下一个十年到来的2038年问题(又称"Y2038"或"Unix Y2K"问题).Lin ...

  9. 2038计算机系统,2038年问题

    2038年问题是指在使用POSIX时间的32位计算机应用程序上,格林尼治时间2038年1月19日凌晨03:14:07(北京时间:2038年1月19日中午11:14:07)之后无法正常工作. 中文名 2 ...

最新文章

  1. 如何关闭Visual Assist?
  2. python面向对象基础
  3. 深度学习算法简要综述(下)
  4. linux树莓派扩容,树莓派ubuntu 扩容
  5. DesignPattern_Java:Proxy Pattern
  6. 当开发帆软插件得时候如果安装插件遇到 ***插件版本过低 请安装高版本插件
  7. shell学习笔记(五)
  8. [代码片断]SQL中解析XML数据
  9. 用VBA实现OUTLOOK接收新邮件后的自动转发
  10. PADS——导出Gerber文件
  11. 时域、频域、傅里叶变换
  12. 会员运营五大难题与破解之道
  13. Could not start Tomcat
  14. 用python把图片换成蓝底_用python 将蓝底照片转化为白底照片
  15. 【spring】切入点(Pointcut)、方面/切面(Aspect、Advisor)详解
  16. 用python绘制玫瑰花的代码_Python 玫瑰花绘制
  17. java获取当前时间和求时间差(分钟,秒钟,小时,年等)
  18. PID控制参数整定(调节方法)原理+图示+MATLAB调试
  19. 背诵微机原理与接口这一篇就够了
  20. 分流稳压器TL431/TLV431

热门文章

  1. mysql 存储表情符号
  2. ekho tts 下载_TTS技术简单介绍和Ekho(余音)TTS的安装与编程
  3. level set 介绍4(水平集应用)
  4. Unity Instantiate函数用于复制对象
  5. 分时技术用户可以独占计算机资源,华南理工网络教育操作系统随堂练习
  6. 【目标检测论文阅读笔记】QueryDet: Cascaded Sparse Query for Accelerating High-Resolution Small Object Detection
  7. 干掉AlibabaProtect【windows10】
  8. web项目高并发量网站解决方案
  9. AoE 和TensorFlow Lite ,没有谁比它们更般配!
  10. 2020最新软件测试(Python自动化测试)面试宝典大全(一)挑战高薪必备!!!赶紧收藏!!!!