2015-07-29 3 views
4

Когда я пытаюсь форматировать дату из одного часового пояса в тот же часовой пояс, я получаю неправильное время (разное на 1 час). Мой код:Почему PHP IntlDateFormatter возвращает неверную дату? +1 час

$formatter = new IntlDateFormatter(
    'ru_RU', 
    IntlDateFormatter::FULL, 
    IntlDateFormatter::FULL, 
    'Europe/Moscow' 
); 

$date = new DateTime("2015-07-29 14:00:00", new DateTimeZone('Europe/Moscow')); 
echo $formatter->format($date); 

Ожидаемое время 14:00, но 15:00 возвращается.

ОБНОВЛЕНИЕ: Когда я показываю 2013 или 2014 год, все в порядке! Что произойдет в 2015 году?

UPDATE2: +1 час добавлено с 26 октября 2014 года. Время, когда Россия переходит на вечное зимнее время. ОК. Но ... как правильно отформатировать?

+0

Что делает 'var_dump ($ date);' give? Я не могу запустить его сам прямо сейчас. – alexn

+0

@alexn, класс 'DateTime # 2 (3) { общественная дата $ => строка (19) "2015-07-29 14:00:00" публика $ timezone_type => Int (3) общественности $ часовой пояс => строка (13) «Европа/Москва» } ' – psylosss

ответ

2

Если у вас есть такая же проблема, обновление Icu (International Components для Unicode) в ОС.

0

Проверьте файл php.ini для date.timezone и убедитесь, что его набор для

date.timezone = "Europe/Moscow"

+0

Да,' 'Европа/Москва'' установлена. Кроме того, date_default_timezone_get() возвращает '' Европа/Москва'' – psylosss

3

Я использую непосредственно 'GMT + 03: 00' вместо 'Европа/Москва'. Очевидно, разработчикам библиотеки не хватает времени для законодателей.

+0

Это нехорошее решение, потому что в некоторых странах есть зимнее/летнее время. – psylosss

+0

Конкретно в «Европе/Москве» нет деления на летнее время. –

+0

Действительно, «Европа/Москва» не имеет этого подразделения, но многие другие. Таким образом, это решение не является надежным с использованием жестко заданных значений. Кроме того, это решение зависит от законодателей, и что вы будете делать, если это разделение произойдет? :) – psylosss

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