这是一个php错误,还是我的时区/php设置有问题?

这是一个php错误,还是我的时区/php设置有问题?,php,datetime,exception-handling,timezone,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(); } 不确定确切的问题,但尝试使用此功能设置时区: date_default_timez

文件的真实完整内容:

<?php

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

try {

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

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

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

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

看看这是否有效。

我打赌这是一个PHP错误。我知道PHP过去在捕获构造函数中抛出的异常时会遇到问题,这就是这里发生的事情

因为这是一个bug,你的选择是

  • 更新服务器的PHP版本;你说这不是一个选择
  • 使用
    strotime()
    查找日期,或者,如果您需要或想要访问面向对象样式的
    DateTime
    ,请使用
    strotime()
  • 例如:

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

    我遇到了类似的问题,可以用

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

    希望这对其他人有所帮助。

    未捕获异常的服务器已经有一个设置(默认时区美国/芝加哥)。是的,我以前已经尝试过,但它似乎没有任何作用。这是一个奇怪的问题,让我们看看解决方案,然后您甚至可以尝试扩展DateTime类,并使用上面的代码重写构造函数,除非您使用的是parent::\u construct(),而不是new DateTime。请记住,原型必须相同,因此您的构造应该采用两个参数(字符串$str,DateTimeZone$timezone=null)。这还有一个额外的好处,那就是确定_construct()不可修补的异常错误是否是问题的根源。是的,我目前正在使用strotime,确保它不会失败,然后将它提供给DateTime构造函数-我将尝试扩展。可以在PHP 5.5.9ubuntu中重现这一点。