2014-09-09 2 views
0

Как обычно, я прочитал страницу руководства для setTimeZone и Googled для любых предыдущих решений, но пока не повезло.PHP 5.2.12 - Установка часового пояса в объекте DateTime

У меня есть два сервера, один работает на PHP 5.3 (сервер A) и один работает с PHP 5.2 (сервер B). PHPinfo для обоих показывает, что поддержка даты/времени включена, и есть база данных Timezone.

Однако при переносе сценария с сервера A на сервер B, я начал получать сообщение об ошибке

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

со ссылкой на

$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 (P HP 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, я думаю, из-за документированной проблемы с использованием print_r в datetime в PHP5.2.

Однако, насколько я могу судить из документации, setDateTimeZone поддерживается в PHP5.2, так что я не могу понять, почему это не будет работать на сервере B.

Может кто-нибудь посоветовать? Если это имеет какое-либо значение, сервер A работает с Apache и сервером IIS.

ответ

1

Интересно, но довольно просто объяснить: Как пояснялось в DateTime docs, возвращаемое значение setTimezone было null до PHP 5.3.

В коде присваивается значение setTimezone переменной $utc. В PHP 5.3 $utc теперь снова является объектом DateTime, в PHP 5.2 это null. В следующей строке вы пытаетесь вызвать метод format на $utc, который, конечно же, должен завершиться неудачей в PHP 5.2.

+0

Вы абсолютно правы. Не могу поверить, что я пропустил это в руководстве. Все, что нужно, - это изменить $ utc = $ dateobject-> setTimeZone() на $ dateobject-> setTimeZone(), а затем использовать $ dateobject в любых других операциях и ошибка исчезла. – Ambulare

Смежные вопросы