Skip to content

Instantly share code, notes, and snippets.

@imbyc
Last active March 22, 2023 02:49
Show Gist options
  • Save imbyc/2c162014ede26c16547951fe400fba54 to your computer and use it in GitHub Desktop.
Save imbyc/2c162014ede26c16547951fe400fba54 to your computer and use it in GitHub Desktop.
[Y2K38 2038问题] #php
<?php
// 如果返回2556115199那么就正常。如果返回false那么也会受到影响。
var_dump(strtotime("2050-12-31 23:59:59"));

解决方案

  • 方案一 更换系统和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日

https://segmentfault.com/a/1190000009120211

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment