加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

关于PHP转换高出2038年日期堕落的题目办理

发布时间:2021-01-24 08:07:56 所属栏目:编程 来源:网络整理
导读:媒介 最近在写一个项目接口。测试中发明处事器上测试正常的成果,在当地一向有题目。一步步的排查,最终锁定题目是因为函数 strtotime 返回了一个 false 值,导致数据插入数据库失败。 沟通代码运行功效纷歧样,缘故起因那就是情形纷歧致导致。要么是PHP版本差异

媒介

最近在写一个项目接口。测试中发明处事器上测试正常的成果,在当地一向有题目。一步步的排查,最终锁定题目是因为函数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时刻戳转换为日期。

下面详细演示一下

要领一

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

要领二

上面功效假如返回2556115199那么就正常。假如返回false那么也会受到影响。

办理方案

方案一

改换体系和PHP均为64位。这个价钱较量大,可是可以永世办理题目。

方案二

PHP5.2版本之后提供了一个函数DateTime可以姑且办理一下题目。

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日

总结

以上就是这篇文章的所有内容了,但愿本文的内容对各人的进修可能事变能带来必然的辅佐,假若有疑问各人可以留言交换,感谢各人对编程之家的支持。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读