Timezone в PHP и MySQL – странный глюк
Столкнулся с необходимостью работы в нескольких временных зонах одновременно. До этого момента как-то не задумывался на тем, для чего оно надо, пока не столкнулся с такой ситуацией: из mysql возвращается unxi_timestamp (число секунд, прошедших с начала unix-эпохи), на стороне mysql оно форматируется при выводе в одно время, а если форматнуть его с помощью функции PHP date() то получаем время с часовой разницей.
Это из-за того, что на сайте я задаю timezone отличную от той, которая используется в mysql с помощью функции date_default_timezone_set.
По-началу я думал что ситуация неразрешима, что настройка временной зоны внутри mysql глобальная для всего сервера. Но это оказалось не так. Можно изменить временную зону для mysql-сессии запросом: “SET time_zone = ‘<имя зоны>’”.
Список временных зон, которые поддерживаются mysql сервером можно получить запросом: SELECT Name FROM mysql.time_zone_name;
После того как я стал задавать временную зону, такую-же как в PHP сессии то странные расхождения во времени пропали. После установки mysql-соединения рекомендую выполнить команду:
mysql_query(”/*!40101 SET time_zone = ‘”.date_default_timezone_get().”‘ */”,$db_resource);
ну или просто запрос “SET time_zone = ‘имя зоны’;”
Но, как говорится, для каждой бочки меда всегда найдется ложка дегтя. Через пару дней наткнулся на странный глюк (думаю это глюк PHP версии 5.1.6, проверить насколько это верно сейчас нет возможности).
Проблема заключается в следующем:
После вызова функции date_default_timezone_set(), я уже не могу задать другую временную зону для скрипта.
Такое чувство что она “одноразовая” – что поставил в первый раз, то и работает.. хотя date_default_timezone_get() возвращает при этом разные результаты.
После массы тестов пришел к совсем чудесному результату… Код работает, но какой!!!
Есть у меня файл config.php, там строки:
$config['timezone'] = ‘Europe/Dublin’;
date_default_timezone_set($config['timezone']);
далее, в классе где мне нужно переключать часовой пояс (в недрах класса, который генерирует отчеты для пользователей в разных часовых поясах), работает такая штука:
global $config;
$config['timezone'] = ‘Europe/Paris’;
А инструкция date_default_timezone_set(’Europe/Paris’) которая там была до этого не работает! Я в шоке
Буду рад комментариям по делу.
P.S. Не совсем в тему, но информативно – статья на Хабре про часовые пояса в PHP.

Меня зовут Владимир. Я живу в России, в 
Один комментарий к “Timezone в PHP и MySQL – странный глюк”
solarisadmin - Янв 16, 2010 | Ответить
Про установке через MySQl не знал, спасибо.