如果在编译PHP的系统上运行Drupal或限制为使用32位整数,则只能输入1901年到2038年之间的日期(特别是1901年12月13日20:45:52 UTC到03:14: 07年1月19日UTC时间20)。这通常被称为2038错误。
通常的症状是将日期显示或记录为1970-01-01,而不是超出上述范围的预期值。这将影响所有 PHP应用程序。特别是在Drupal中,基于日期的字段类型受到影响,即仅日期和日期和时间,包括“选择列表”小部件。您可以选择1900到2038范围之外的年份,但由于PHP本身无法处理它们,它们将在没有警告的情况下存储/显示为1970-01-01。
受影响的产品
- 适用于x86的PHP 5.x / 7.x和适用于x64的PHP 5.x的官方Windows版本。
- 任何带有PHP编译为32位和/或在32位系统上运行的Web堆栈包(XAMPP,Wamp等)。
- 在 2018年6月14日发布之前的Acquia Dev Desktop 2(它现在使用64位PHP和MySQL)。
注意:PHP本身的编译方式如下:如果你在64位操作系统中运行32位版本的PHP,你仍然会遇到这个问题。
测试
要测试您的PHP是否受到影响,您可以运行此命令(作为一行):
php -r "echo (date('y',strtotime('2039-01-01')) == 39 ? 'OK' : 'Y2K38 limitation') . PHP_EOL;"
打印OK
受影响的PHP实例时,将打印未受影响的PHP实例Y2K38 limitation
。
评论