Невозможно установить правильный 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,

3

Решение

Используйте метод 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, которую вы можете установить в своей системе.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector