为什么strtotime()在不同的服务器上以不同的方式工作?

问题描述:

<?php 

header('Content-Type: text/plain'); 

$time = '0000-00-00 00:00:00'; 
echo $time . PHP_EOL . PHP_EOL; 

$time = strtotime($time); 
echo $time . PHP_EOL . PHP_EOL; 

在我们的开发服务器上,第二个$time不输出任何内容。 var_dump()的测试显示其值为false。这很好。在现场服务器上,我得到943920000。用var_dump()进行的测试显示这是一个整数。为什么strtotime()在不同的服务器上以不同的方式工作?

为什么?

显然it is fairly common for dates of zero to come up as 30 November 1999。为什么?为什么在某些服务器上而不是其他的?

+0

这可能是因为不同服务器上的时区差异或配置? –

+0

也许不是最好的解决方案,但在做转换之前检查'$ time == 0'是什么?详细了解您的设置(时区配置,PHP版本,...) – breiti

+0

@breiti。这就是我最终做的。它似乎工作。我只是想知道1999年11月30日有什么特别的。 – TRiG

PHP Manual page for strtotime()之前,我们得到如下:

成功则返回时间戳,否则返回FALSE。

因此,在您的其中一台服务器上,致strtotime()的呼叫失败。

那么为什么会失败呢?这个问题的答案也是一样的手册页:

错误/异常

每次调用日期/时间函数,如果时区是无效的会产生一个E_NOTICE,和/或如果使用系统设置或TZ环境变量,则显示E_STRICT或E_WARNING消息。另请参见date_default_timezone_set()

因此,在我看来,您的一台服务器没有正确配置时区语言环境。如果可能的话,我建议不要使用strtotime()这样的东西。这是一个笨重的旧功能,而较新的PHP datetime library提供更好/更干净的功能。您可以使用它创建一个日期时间对象,如下所示:

$date = new DateTime('0000-00-00 00:00:00'); 

希望有帮助。

+0

[PHP.net上的评论](https://bugs.php.net/bug.php?id=45647):“这里没有错误,00-00- 00表示2000-00-00,即1999-12-00,即1999-11-30。没有错误,完全正常。“ – TRiG

尝试

setlocale(LC_ALL, "C"); 

任何的strtotime呼叫