Timezone в PHP и MySQL – странный глюк

Опубликовал mvs3d | Дата 03.11.2009 – 02:52 |

Столкнулся с необходимостью работы в нескольких временных зонах одновременно. До этого момента как-то не задумывался на тем, для чего оно надо, пока не столкнулся с такой ситуацией: из 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.

  1. Один комментарий к “Timezone в PHP и MySQL – странный глюк”

  2. solarisadmin - Jan 16, 2010 | Ответить

    Про установке через MySQl не знал, спасибо.

Оставить комментарий или два

Об авторе

Меня зовут Владимир. Я живу в России, в г.Тольятти Самарской области. C 2004 года активно занимаюсь Web-разработками. Интересуюсь развитием сервисов Сети, технологиями создания и продвижения Интернет-ресурсов, компьютерными железками.. и не только ;)

Подпишись на обновления!

 RSS-канал / Email-рассылка
Поиск :