PHP 5.2.12 - 在DateTime对象上设置时区

时间:2014-09-09 10:37:03

标签: php datetime

像往常一样,我已经阅读了setTimeZone和Googled手册页以获取任何以前的解决方案,但到目前为止,没有运气。

我有两台服务器,一台运行PHP 5.3(服务器A),另一台运行PHP 5.2(服务器B)。两者的PHPinfo都显示启用了日期/时间支持,并且有一个时区数据库。

但是,在将脚本从服务器A迁移到服务器B时,我开始收到错误消息

  

致命错误:在非对象

上调用成员函数format()

指的是

$startdate = $startdate->format("c");

为了测试出错的地方,我在两台服务器上运行了以下脚本:

$startdate = '2014-05-05 10:00:00';
echo "Start: " . $startdate ."<br/>";

$tzone = new DateTimeZone('Europe/London');
echo "Tzone: " . print_r($tzone, true) ."<br/>";

$dateobj = new DateTime($startdate, $tzone);
echo "Date Obj: " . print_r($dateobj, true) ."<br/>";

$formatted = $dateobj->format("c");
echo "Formatted: " . print_r($formatted, true) ."<br/>";

$utzone = new DateTimeZone('UTC');
echo "UTzone: " . print_r($utzone, true) ."<br/>";

$utc = $dateobj->setTimeZone($utzone);
echo "UTC: " . print_r($utc, true) ."<br/>";

$formatted2 = $utc->format("c");
echo "Formatted UTC: " . print_r($formatted2, true) ."<br/>";

从服务器A(PHP 5.3)我得到

Start: 2014-05-05 10:00:00
Tzone: DateTimeZone Object ( ) 
Date Obj: DateTime Object ( [date] => 2014-05-05 10:00:00 [timezone_type] => 3 [timezone] => Europe/London ) 
Formatted: 2014-05-05T10:00:00+01:00
UTzone: DateTimeZone Object ( ) 
UTC: DateTime Object ( [date] => 2014-05-05 09:00:00 [timezone_type] => 3 [timezone] => UTC ) 
Formatted UTC: 2014-05-05T09:00:00+00:00 

从服务器B(PHP 5.2)我得到

Start: 2014-05-05 10:00:00
Tzone: DateTimeZone Object ( ) 
Date Obj: DateTime Object ( ) 
Formatted: 2014-05-05T10:00:00+01:00
UTzone: DateTimeZone Object ( ) 
UTC: 

Fatal error: Call to a member function format() on a non-object 

格式化行包含一个字符串这一事实表明填充了DateTime对象,而且我认为是空白的print_r,因为在PHP5.2中在datetime上使用print_r有记录的问题

但是,据我在文档中可以看出,PHP5.2支持setDateTimeZone,因此我无法解决为什么这不能在服务器B上运行。

任何人都可以提供建议吗?如果它有任何相关性,则服务器A运行Apache和服务器B IIS。

1 个答案:

答案 0 :(得分:1)

有趣但又很容易解释:正如DateTime docs中所述,setTimezone的返回值为null,直到PHP 5.3。

在您的代码中,您将setTimezone的结果分配给$utc变量。在PHP 5.3中,$utc现在又是DateTime对象,在PHP 5.2中它是null。在下一行中,您尝试在format上调用$utc方法,这当然必须在PHP 5.2中失败。