У меня есть список событий, которые установлены на определенное (британское) время. Я хочу, чтобы пользователи видели время события по местному времени. Например: если событие начинается в 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
,
DateTimeZone
до создания DateTime
объект. Я удостоверился, что это был правильный объект и установил его в DateTime
конструктор тогда.DateTime
сначала объект только с отметкой времени в качестве параметра, и установка DateTimeZone
объект позже (я знаю, что есть / была ошибка, которая вызвала некоторое странное поведение с настройкой DateTimeZone
напрямую). 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
,
Используйте метод 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, которую вы можете установить в своей системе.
Других решений пока нет …