Pull to refresh

PHP — отмена перехода на зимнее время

8 февраля 2011 года президент РФ Дмитрий Медведев объявил об отмене перехода на зимнее время в ночь с 29 по 30 октября. Также он заявил, что «отмена перевода часов никак не скажется на технике», ведь все производители разом возьмут и позаботятся об этом, и всё бы это было прекрасно, если бы создатели PHP не решили встроить свои независимые таблицы часовых поясов в интерпретатор. Решение проблемы под катом.

Предыстория


Где-то в начале октября я озаботился проблемой отмены перевода часов на зиму, соответственно на обоих серверах (с PHP и MySQL соответственно) был обновлён пакет tzdata. После обновления опытным путём (date --date='1 month') было установлено, что перевода часов не произойдёт. На этом проблема, вроде бы, была решена.

30 октября — чёрный день для PHP-программ


Ночью с 29 на 30 октября оказалось, что MySQL, который использует системные библиотеки для работы с часовыми поясами (tzdata на linux) определяет время верно, а PHP — нет.
Дальнейшие телодвижения привели меня к тому, что в PHP, начиная с версии 5.1 используются свои таблицы часовых поясов, чтобы сохранить «OS independency», решить проблему для начала оказалось возможным тремя методами:
1. Изменить в php.ini директиву date.timezone на «Etc/GMT-4» (именно минус, ибо отсчитываются зоны от Гринвича на Восток в данном случае со знаком минус), что показалось мне костылём.
2. Сделать в начале всех/основного файла .php вызов функции date_default_timezone_set(«Etc/GMT-4»); Что для меня показалось ещё большим костылём, чем предыдущий вариант.
3. Обновить PHP до 5.3.8, возможно там таблицы обновили, но для меня это критично (боевой сервер).

Скажи костылям нет!


Итак, после рассмотрения всех вариантов и установки первого как «временного костыля» мне пришла в голову мысль по поводу PECL, поиск сразу же дал нужный ответ: pecl/timezonedb содержит актуальные базы данных временных зон, которые работают поверх используемых в PHP.
Команда «pecl install timezonedb» окончилась привычной фразой «add extension=timezonedb.so to your php.ini», после добавления экстеншена и установки date.timezone = «Europe/Moscow» всё встало на круги своя.
Всё-таки PECL-расширение костылём назвать сложно, поэтому я остановился на этом варианте.
На написание заметки сподвигло полное отсутствие информации о timezonedb как решении проблемы в рунетах. Надеюсь, данная инструкция кому-нибудь поможет сохранить час своего драгоценного времени.
Спасибо за внимание, от инвайта не откажусь.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.