【问题标题】:Year returns 1970 in PHP [duplicate]年份在 PHP 中返回 1970 [重复]
【发布时间】: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 单独存储组件,因此没有这个弱点。

标签: php date


【解决方案1】:

对于低于 5.2.16 的 PHP 版本,即使 PHP_INT_SIZE = 8,问题似乎很容易重复。对于该版本及更高版本,代码可以正确执行。将 PHP 升级到 5.2.16 应该可以解决它。仅针对 PHP_INT_SIZE = 8(64 位)进行了测试

Here you can check for yourself.

如果您碰巧使用的是 PHP 5.2.0 或更高版本(但低于 5.2.16),您可以按照问题 cmets 中其他人的建议参加 DateTime 课程。

注意:在已安装的服务器上升级服务可能是不可能的,在工作中甚至在大学课程中都不可能。但是如果碰巧有可能,那么您应该在升级之前测试正确的 PHP 版本。如果它有效,您应该调查为什么它已被修复以及添加功能的时间,谷歌搜索 PHP 的 bugtracker。然后建议更改。

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
相关资源
最近更新 更多