文件的真实内容:
<?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,因为我没有管理员权限。
答案 0 :(得分:10)
我的赌注是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();
}
答案 1 :(得分:1)
不确定确切的问题但请尝试使用此功能设置时区:
date_default_timezone_set('Europe/London'); // or whatever timezone
看看是否有效。
答案 2 :(得分:0)
我遇到了类似的问题,能够解决
date('date format', $str);
date("Y-m-d", $news->created);
希望能有所帮助。