我可以在无效日期避免“DateTime :: __ construct”警告吗?

时间:2017-08-24 08:07:39

标签: php datetime

这大约是DateTime::__construct。根据这个comment

  

如果无法解析时间,则抛出可以捕获的Exception类型的异常,但也会发出E_WARNING。如果要将警告转换为错误或关闭处理程序中的异常,则可能会造成混淆。

我可以避免警告吗?我有一个代码(我不在乎日期是否格式良好):

try {
    $var = new DateTime('some invalid date format');
} catch (Exception $exception) {
    $var = null;
}

但它仍然发送一个报告给我的错误捕获器的E_WARNING(我在Laravel应用程序中使用NewRelic)。而且我不希望报告此错误,因为它不是错误,我抓住了它。

如何避免DateTime::__construct发出警告?

3 个答案:

答案 0 :(得分:3)

这可能是少数几个可以使用的案例之一:

try {
    $var = @new DateTime('some invalid date format');         
} catch (Exception $e) {
    $var = null;
}

但是,您可以通过执行以下操作来避开@运算符:

try {
    $oldErrorReporting = error_reporting();
    error_reporting($oldErrorReporting & ~E_WARNING);
    $var = new DateTime('some invalid date format'); 
    error_reporting($oldErrorReporting);        
} catch (Exception $e) {
    $var = null;
}

答案 1 :(得分:2)

请改用date_create()功能。

它(我假设)内部工作类似于您要避免的try/catch块,如果日期无效则返回FALSE。它不会触发任何错误或警告。

代码:

$var = date_create('some invalid date format');

或多或少与:

相同
try {
    $var = new DateTime('some invalid date format');
} catch (Exception $exception) {
    $var = false;
}

答案 2 :(得分:1)

您应该创建一个错误处理程序,如下所示:

//set_error_handler();
set_error_handler(function($msg, $code, $severity, $file, $lineno, $errText) {
    if (0 === error_reporting()) {
        return false;
    }
    throw new ErrorException($msg, $code, $severity, $file, $lineno);
});

然后,

try {
    $var = new DateTime('some invalid date format');
} catch (ErrorException $exception) {
    $var = null;
}