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

时间:2010-02-15 05:23:04

标签: php datetime exception-handling timezone

文件的真实内容:

<?php

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

try {

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

} catch ( Exception $e ) {
        echo $e->getMessage();
}

DateTime构造函数接受一个字符串,如果它无法解析它,它应该抛出异常。这在我的本地计算机上运行正常但在我的一个远程服务器上没有捕获到异常(并且我使用try / catch和SAME EXACT代码):

  

致命错误:未捕获的异常   信息'异常'   'DateTime :: __ construct()[function.DateTime --- construct]:   无法解析时间字符串(lol)   位置0(l):时区不能   可以在数据库中找到   /var/www/html/site_com/rez/date.php:9   堆栈跟踪:#0   /var/www/html/site_com/rez/date.php(9):   DateTime-&gt; __ construct('lol')#1 {main}   投入   /var/www/html/site_com/rez/date.php on   第9行

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

  

PHP Version 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没有值没有值

我的本​​地设置确实有效:

  

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没有值没有值

在本地,它捕获异常并输出错误。两者上的date.timezone都没有价值。

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

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

3 个答案:

答案 0 :(得分:10)

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

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

  1. 更新服务器的PHP版本;你说这不是一个选择
  2. 使用strtotime()查找日期,或者,如果您需要或希望访问DateTime的面向对象样式,请使用strtotime()
  3. 捕获错误

    例如:

    <?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();
    }
    

答案 1 :(得分:1)

不确定确切的问题但请尝试使用此功能设置时区:

date_default_timezone_set('Europe/London'); // or whatever timezone

看看是否有效。

答案 2 :(得分:0)

我遇到了类似的问题,能够解决

date('date format', $str);
date("Y-m-d", $news->created);

希望能有所帮助。