解决PHP2038年时间存储显示问题

/***可替换传统date函数 时间戳转时间-解决时间戳超出2038年的问题
* @param $curformat Y-m-d
* @param $utc_value 1610329688
* @return false|string
*/
function newDate($curformat='Y-m-d H:i:s', $utc_value)
{
if($utc_value>2147483647)//2038-01-19 11:14:07
{
$mydate2 = new DateTime('@'.$utc_value);
$string = $mydate2->format($curformat);
}else{
$string = date($curformat, $utc_value);
}
return $string;
}

改造过的datetime (必须修改,否则后台编辑的时候会报错)
function datetime($time, $format = 'Y-m-d H:i:s')
{
// $time = is_numeric($time) ? $time : strtotime($time);
// return date($format, $time);
if($time>2147483647)//2038-01-19 11:14:07
{
$mydate2 = new DateTime('@'.$time);
$string = $mydate2->format($format);
}else{
$string = date($format, $time);
}
return $string;
}

/**可替换传统strtotime函数-解决时间戳超出2038年的问题
* @param $str_time 2111-01-11 01:48:08
* @return false|int|string
*/
function newStrToTime($str_time)
{
$result = strtotime($str_time);
if(empty($result))
{
$date = new DateTime($str_time);
$result = $date->format('U');
}
return $result;
}

//项目中需要修改的地方
数据库设置 bigint 10位(经测试必须使用bigint 否则,即便是int 11位也不行)
common中新增newStrToTime 函数代码如上面 修改datetime里面代码为newDate里面的代码
代码设置 用到的地方都修改成新写的函数即可,示例如下,这个是我项目里面的
public function setFinishTimeAttr($value) //设置会员到期时间
{
//return $value && !is_numeric($value) ? strtotime($value) : $value;
return $value && !is_numeric($value) ? newStrToTime($value) : $value;
}

THE END