文件的真实,完整内容:
<?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代码):
Fatal error: Uncaught exception
‘Exception’ with message
‘DateTime::__construct() [function.DateTime—construct]:
Failed to parse time string (lol) at
position 0 (l): The timezone could not
be found in the database’ in
/var/www/html/site_com/rez/date.php:9
Stack trace: #0
/var/www/html/site_com/rez/date.php(9):
DateTime->__construct(‘lol’) #1 {main}
thrown in
/var/www/html/site_com/rez/date.php on
line 9
未捕获异常的远程服务器的设置:
PHP Version 5.2.5
date date/time support enabled
“Olson” Timezone Database Version
2007.9 Timezone Database internal Default timezone America/Chicago
Directive Local Value Master Value
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
date date/time support enabled
“Olson” Timezone Database Version
0.system Timezone Database internal Default timezone System/Localtime
Directive Local Value Master Value
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,因为我没有管理员权限.
我的赌注是PHP错误.我知道PHP曾经遇到过捕获构造函数中抛出的异常的问题,而这似乎就是这里发生的事情.
因为这是一个错误,你的选择是
>更新服务器的PHP版本;你说这不是一个选择
>使用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();
}