PHP-PHP如何处理2038年后的日期呢?

PHP-PHP如何处理2038年后的日期呢?

夜无邪 发布于 2017-10-29 字数 216 浏览 1217 回复 2

在我的windows机器上运行以下代码没有结果,但是服务器上运行正常,请教大家原因何在?有何解决办法?

<?php
echo strtotime('2039-1-1 1:20:32');
echo "n";
?>

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

偏爱自由 2017-11-06 2 楼

这个问题不仅仅局限于 php,而是因为 unix 的时间戳 timestamps 的最大值是到 2038 年,如果你要保存大于 2038 年的时间最好还是用字符串吧,别用时间戳,目前这个问题暂时无解。

如果只是保存当前的时间,使用时间戳还是不会有大问题的,因为估计到了 2038,一个是你的系统已经不知道升级多少次了,目前的代码早已淘汰,另外操作系统,语言等应该都会有相应的解决方案。

这个问题属于“2038年问题”,所有使用 POSIX 时间表示时间的程序都将受其影响,因为它们以自1970年1月1日经过的秒数(忽略闰秒)来表示时间。在大部份的32位操作系统上,此 “time_t” 数据模式使用一个有正负号的32位整数(signed int32)存储计算的秒数。依照此 “time_t” 标准,在此格式能被表示的最后时间是2038年1月19日03:14:07,星期二(UTC)。超过此一瞬间,时间将会 “绕回”(wrap around)且在内部被表示为一个负数,并造成程序无法工作,因为它们无法将此时间识别为2038年,而可能会依个别实现而跳回 1970 年或 1901 年。错误的计算及动作可能因此产生。

目前并没有针对现有的CPU/操作系统搭配的简单解决方案。直接将POSIX时间更改为64位模式将会破坏对于软件、数据存储以及所有与二进制表示时间相关的部份的二进位兼容性。更改成无符号的32位整数则会影响许多与两时间之差相关的程序。不过,那时使用32位系统的计算机可能会很少。

大部份 64 位操作系统已经把 time_t 这个系统变量改为 64 位宽。不过,其他现有架构的改动仍在进行中,不过预期 “应该可以在2038年前完成”。

甜柠檬 2017-11-04 1 楼

这主要是32位机出现的问题,64位机不存在该问题。
php 5.2之后,提供了DateTime类可以处理该问题:

date_default_timezone_set('UTC');//或者在php.ini中配置date.timezone="UTC"
try{
  $date = new DateTime('2039-1-1 1:20:32');
}catch(Exception $e) {
  echo $e->getMessage();
  exit(1);
}
echo $date->format('l d F Y H:i');//Saturday 01 January 2039 01:20

如果是 php 4/5,可以包含类 date.class.php 解决该问题
下载地址:http://xwisdomhtml.com/downloads/dateclass.zip
详细介绍:http://xwisdomhtml.com/dateclass.html