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