2016-01-20 8 views
3

Я пытаюсь, чтобы получить смещение часового пояса, как этогоPhp Переход на летней проблему с Тихим/Фиджи

$zone = new DateTimeZone('Europe/Oslo'); 
$c = new DateTime(null, $zone); 
$offset = $c->getOffset(); 
$transitions = $zone->getTransitions(time(), time()); 
echo '<pre>',print_r($transitions),'</pre>'; 

который возвращает смещение в секундах, которое отлично. Но это смещение не работает правильно для часового пояса «Pacific/Fiji». Для Фиджи он возвращает 46800 (т. Е. GMT + 13), что неверно, и должно было быть 43200. Google говорит, что fiji - это GMT +12 here. Я даже попробовал установить часовой пояс по умолчанию для Европы/Лондона или UTC, но смещение фиджи не подходит. Флаг дневного света (индекс isdst в массиве $ transitions) активен для fiji, который, как мне кажется, должен быть ложным в случае fiji, поскольку их летнее время только что закончилось. Несколько других часовых поясов также активны, как Америка/Асунсьон, Америка/Кампо_Гранде, Америка/Sao_Paulo, Австралия/Аделаида и т. Д., Но все их смещения верны.

Любая причина, по которой смещение фиджи все еще показывает GMT + 13, а не GMT ​​+ 12? Я искал форумы целый день и ни одной подсказки.

P.S. Фиджи: Когда местное дневное время приближалось к воскресеньям, 18 января 2015 года, 03:00:00 часы были обращены назад 1 час до воскресенья, 18 января 2015 года, 02:00:00 вместо обычного местного времени.

ответ

1

Переход Фиджи в конец DST (их переход «назад») был недавно изменен в базовых данных. Ранее он был установлен до 24 января, но был перенесен на неделю раньше, до 17 января, чтобы согласоваться с объявлениями правительства Фиджи.

Это изменение было внесено в версию 2015g базы данных IANA tz (release notes here). Для PHP вы найдете это в версии 2015.7 от the timezonedb pecl package. Это было выпущено в 2015-10-03, и PHP всегда захватывает последнюю timezonedb перед каждой версией PHP. Поэтому, если вы обновляетесь до версии PHP версии 5.6.14 или выше (или 7.0.0 RC5 на дорожке предварительного просмотра dev), вы автоматически внесете изменения. В противном случае вы можете update timezonedb manually.

В общем случае, если ваше приложение зависит от точности по местному времени (особенно планирование сценариев), то вы должны подписаться Объявления списка at IANA рассылки, так что вы знаете об изменениях, которые могут повлиять на вашу систему, а затем наблюдать за изменения нижнего уровня входящие в библиотеки, фреймворки и операционные системы, чтобы убедиться, что они применяются своевременно. В противном случае вы рискуете несогласованностью, подобной той, которую вы описали.