【发布时间】:2019-04-19 06:00:25
【问题描述】:
如果年份为 2038,则以下代码返回 1970,如果更改为 2037,则返回正确年份 (2037)。为什么?
$date = '28/05/2038';
$date = strtr($date, '/', '-');
$year = date('Y', strtotime($date));
echo $year;
我做了一些研究,了解到当传递的值不受支持时,strtotime 转换返回 0,因此会发生这种情况。但我不明白如果我将日期从“28/05/2038”更改为“28/05/2037”,它将如何变得不受支持。
【问题讨论】:
-
en.wikipedia.org/wiki/Year_2038_problem ; tl;dr:PHP 自 epoch (1970-01-01) 以来使用 32 位秒,而在 2038 年它会用完秒。
-
sandbox.onlinephpfunctions.com/code/… 对在线服务的快速测试返回正确答案:2038。当然,在您当前的环境中检查 Amadan 的评论,即 2038 问题。更新:5.2.16 以下的 PHP 版本很容易重复问题
-
当有date\time类时,真的没有人应该使用strtotime()
-
date()和它的同事真的应该被弃用。使用类DateTime来处理这些问题。 -
抱歉,这里应该说 32 位 PHP。如果您使用的是 64 位 PHP,它可以正常工作。见
PHP_INT_SIZE。换句话说,DateTime单独存储组件,因此没有这个弱点。