这是一个php bug,还是我的timezone/PHP设置有问题?

med*_*iev 8 php timezone datetime exception-handling

文件的真实,完整内容:

<?php

error_reporting(E_ALL);
ini_set(display_errors, 'on');

try {

    //$x = strtotime('blah');
    $x = new DateTime('lol');

} catch ( Exception $e ) {
        echo $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)

DateTime构造函数接受一个字符串,如果它无法解析它,它应该抛出异常.这运行正常我的本地机器上,但在我的远程服务器中的一个例外没有被捕获(又一遍,我正在使用的try/catch和完全相同的代码):

致命错误:未捕获的异常'Exception',消息'DateTime :: __ construct()[function.DateTime --- construct]:无法解析位置0(l)处的时间字符串(lol):在时区中找不到时区数据库'在/var/www/html/site_com/rez/date.php:9堆栈跟踪:#0 /var/www/html/site_com/rez/date.php(9):DateTime - > __ construct('lol' )第9行/var/www/html/site_com/rez/date.php中抛出#1 {main}

未捕获异常的远程服务器的设置:

PHP版本5.2.5

启用日期日期/时间"Olson"时区数据库版本2007.9时区数据库内部默认时区America/Chicago

指令本地值主值date.default_latitude 31.7667 31.7667 date.default_longitude 35.2333 35.2333 date.sunrise_zenith 90.583333 90.583333 date.sunset_zenith 90.583333 90.583333 date.timezone no value no value

我的本地设置在哪里工作:

PHP 5.2.10

日期/时间支持已启用"Olson"时区数据库版本0.system时区数据库内部默认时区系统/本地时间

指令本地值主值date.default_latitude 31.7667 31.7667 date.default_longitude 35.2333 35.2333 date.sunrise_zenith 90.583333 90.583333 date.sunset_zenith 90.583333 90.583333 date.timezone no value no value

在本地,它捕获异常并打印出错误.在date.timezone双方没有任何价值.

也许这只是我内部系统的时区关闭?我的本地方框是Ubuntu而我的遥控器是CentOS,它们可能不一致但是PHP应该不会捕获异常吗?

仅供参考我无法在远程复选框上更新PHP,因为我没有管理员权限.

Fra*_*kie 10

我的赌注是PHP错误.我知道PHP曾经遇到过捕获构造函数抛出异常的问题,而这似乎就是这里发生的事情.

因为这是一个错误,你的选择是

  1. 更新服务器的PHP版本; 你说这不是一个选择
  2. 使用strtotime()查找日期,如果您需要或想要访问的面向对象的风格DateTime,赶上与错误strtotime()

例如:

<?php

try {

    if (@strtotime($str) !== false) {
        $x = new DateTime($str);
    } else {
        throw new Exception("Failed to parse string ({$str})");
    }

} catch ( Exception $e ) {
    echo $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)