PHP - Невозможно установить правильный DateTimeZone в DateTime

Фон


У меня есть список событий, которые установлены на определенное (британское) время. Я хочу, чтобы пользователи видели время события по местному времени. Например: если событие начинается в 20:30 Британское время пользователь из Нидерландов должен видеть время начала как 21:30,


проблема


У меня все настроено, и я создаю новый DateTime объекты для установки моих событий. Тем не менее, когда я указываю мой DateTimeZone объект это показывает +00:00 вместо DateTimeZone Я создал для этого. Это означает, что новые времена неверны. Итак, время, которое было установлено 20:30 Британское время все еще раскатывается как 20:30 NL время вместо 21:30,

Код


Это код, который я написал. Насколько я знаю, все, что я делаю, правильно, но DateTimeZone все еще неверно при назначении на DateTime объект.

Настройка по умолчанию:

date_default_timezone_set('Europe/London');

Код, который должен конвертировать DateTime объекты по местному времени:

$user_timezone = Helper::get_user_timezone(); //contains "Europe/Amsterdam"
foreach($events as $event){
    $timestamp = $event->getDatetime()->getTimestamp();
    $local_datetime = new DateTime('@'.$timestamp, new DateTimeZone($user_timezone));
}

вход


Я буду использовать следующее DateTime объект как вход:

DateTime Object
(
    [date] => 2015-02-14 19:30:00.000000
    [timezone_type] => 3
    [timezone] => Europe/London
)

Выход


Это выводит следующее DateTime объект для меня:

DateTime Object
(
    [date] => 2015-02-14 19:30:00.000000
    [timezone_type] => 1
    [timezone] => +00:00
)

Что я пробовал


Я пробовал несколько вещей. В основном это было о порядке, который я установил DateTimeZone,

  1. Я пытался создать DateTimeZone до создания DateTime объект. Я удостоверился, что это был правильный объект и установил его в DateTime конструктор тогда.
  2. Я пытался создать DateTime сначала объект только с отметкой времени в качестве параметра, и установка DateTimeZone объект позже (я знаю, что есть / была ошибка, которая вызвала некоторое странное поведение с настройкой DateTimeZone напрямую).
  3. Я убедился, что часовой пояс я хочу установить (Europe/Amsterdam) является законным в соответствии с документами.

Я начинаю задумываться, нельзя ли конвертировать дату при использовании timestamp?

Я также рассмотрел эти вопросы для основной сути, но у них нет такой проблемы:
1. Преобразование часовых поясов в PHP
2. Как конвертировать между часовыми поясами в PHP с помощью класса DateTime?

Я последовал еще за парой, но пока не могу их найти.

Вопрос


Почему мой DateTime объект становится неправильным DateTimeZone?

редактировать


После проверки еще раз, что мой DateTimeZone объекты верны, я получаю следующее:

DateTimeZone Object
(
    [timezone_type] => 3
    [timezone] => Europe/Amsterdam
)

Но когда я установил его на новый DateTime возражать как timezone_type а также timezone изменить на:

DateTime Object
(
    [date] => 2015-02-14 19:30:00.000000
    [timezone_type] => 1
    [timezone] => +00:00
)

Вы заметите разные timezone_type а также timezone,

1 ответ

Решение

Используйте метод DateTime::setTimeZone():

date_default_timezone_set('Europe/London');

$date = new DateTime('2015-02-14 19:30:00');
print_r($date);
echo("Local time in London: ".$date->format('Y-m-d H:i:s')."\n");

$date->setTimeZone(new DateTimeZone('Europe/Amsterdam'));
print_r($date);
echo("Local time in Amsterdam: ".$date->format('Y-m-d H:i:s')."\n");

Вывод скрипта выше:

DateTime Object
(
    [date] => 2015-02-14 19:30:00.000000
    [timezone_type] => 3
    [timezone] => Europe/London
)
Local time in London: 2015-02-14 19:30:00
DateTime Object
(
    [date] => 2015-02-14 20:30:00.000000
    [timezone_type] => 3
    [timezone] => Europe/Amsterdam
)
Local time in Amsterdam: 2015-02-14 20:30:00

Если вы не хотите изменять оригинал $date объект, то вы можете clone это и изменить часовой пояс клона:

$roDate = clone $date;
$roDate->setTimeZone(new DateTimeZone('Europe/Bucharest'));
echo("Local time in Bucharest: ".$roDate->format('Y-m-d H:i:s')."\n");

дисплеи:

Local time in Bucharest: 2015-02-14 21:30:00

замечания

Я запустил код с PHP 5.6.6 на OSX.

DateTime и в связанных классах было много ошибок в их ранних версиях (PHP 5.2, PHP 5.3). Большинство из них были исправлены в последних версиях (но все еще есть некоторые хорошо скрытые незначительные проблемы).

Я предлагаю использовать самую последнюю версию PHP, которую вы можете установить в своей системе.

Согласно документации:

DateTime::__ конструкция

Заметка:

Параметр $timezone и текущий часовой пояс игнорируются, если параметр $ time либо является меткой времени UNIX (например, @946684800), либо указывает часовой пояс (например, 2010-01-28T15:00:00+02:00).

Итак, просто используйте решение "setTimezone()" или укажите строку даты и времени:)

Другие вопросы по тегам