位置: 编程技术 - 正文
推荐整理分享关于PHP转换超过2038年日期出错的问题解决(php类型转换的两种方法),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:php类型转换的两种方法,php怎么转换,php怎么转换,php 类型转换,php转换数据类型,php 转go,php转换数据类型,php怎么转换,内容如对您有帮助,希望把文章链接给更多的朋友!
前言
最近在写一个项目接口。测试中发现服务器上测试正常的功能,在本地一直有问题。一步步的排查,最终锁定问题是由于函数strtotime返回了一个false值,导致数据插入数据库失败。
相同代码运行结果不一样,原因那就是环境不一致导致。要么是PHP版本不同,要么是位数不同。
我电脑是位的。这里是PHP位数不一致,服务器使用位,而我本地是位。而strtotime被传入了一个字符串-1-1 ::,该参数大于了-1- ::所以在位PHP下直接返回false,而位PHP不受影响。
Y2K漏洞
导致上述问题的根本原因就是Y2K漏洞,也被称为Unix Millennium Bug。
位系统或PHP
此漏洞将会影响到所有 位系统下用UNIX 时间戳整数来记录时间的 PHP,及其它编程语言。一个整型的变量所能保存的最大时间为 年月 日 ::。超过这个时间后,整型数值将会溢出。
位系统或PHP
位系统下可以保存的日期最远日期是现在宇宙年龄的倍——亿年。所以不会受到该漏洞影响。
如何检测
如何知道你的系统是否收到该漏洞的影响。很简单,直接使用strtotime去转换一个大于年1月日::日期。或者使用date函数将一个大于时间戳转换为日期。
下面具体演示一下
方法一
上面结果如果返回-- ::那么就没有问题。如果返回-- ::那么就受收到影响。
方法二
上面结果如果返回那么就正常。如果返回false那么也会受到影响。
解决方案
方案一
更换系统和PHP均为位。这个代价比较大,但是可以永久解决问题。
方案二
PHP5.2版本之后提供了一个函数DateTime可以临时解决一下问题。
通过DateTime类来操作日期不会受到Y2K漏洞的影响,可以最远支持到年月日
总结
标签: php类型转换的两种方法
本文链接地址:https://www.jiuchutong.com/biancheng/289195.html 转载请保留说明!友情链接: 武汉网站建设