Про перевод часов, таймзону, PHP и Drupal

Вдруг кому поможет, поэтому тут (у меня теплится слабая надежда, что в ближайшие годы новых экспериментов с летним временем не будет, поэтому самому такие записки вроде не нужны).

PHP:

  1. У PHP база данных таймзон вшита в пузо и, конечно, не обновляется регулярно.
  2. Но есть pecl-timezonedb, который ее оверрайдит, со свежей базой (последняя имеет номер версии 2011.13), с этим расширением с таймзонами все станет отлично и любимая всеми Europe/Moscow будет работать как полагается по новым правилам.
  3. Но если вы живете под FreeBSD, то там /usr/ports/misc/pecl-timezonedb не обновлялся очень давно, посему:
    • Меняем там в Makefile 2010.9 на 2011.13
    • удаляем distinfo
    • make && make install
  4. Добавляем timezonedb.so в список extensions.ini (на FreeBSD это сделает make install)
  5. Перестартовываем PHP-fastcgi или Apache или что у вас там работает процесс-сервером для PHP
  6. Ура, можно накатить первый стакан.

Drupal 6:

  1. Сам по себе сразу начинает жить правильно (ну, насколько мне показалось). Т.е. таймзона меняется после апдейта PHP-timezonedb с +0300 на +0400 сама.
  2. Но! В Administer-Date-and-time есть настройка про User Configurable time-zone. Если она включена, то пользователю будут показываться даты-времена в его таймзоне. И весь созданный им контент будет иметь время создания рассчитанное из юзерской таймзоны.
  3. Но. Юзерская таймзона специфицирована в секундах смещения от UTC.
  4. Выходов два: или для всех российских пользователей взять и поправить скриптом (по хорошему, с учетом даты регистрации), или просто отменить настройку пользовательских таймзон. Я пошел по второму пути.

Comments

самый последний Freenas про указ президента не в курсе ;)

FreeBSD 8.2-RELEASE-p3 #7: Fri Sep 30 12:51:49 PDT 2011

ждём следующий выпуск

Так у тебя там PDT, у Pacific Daylight Time - свой президент есть.
Прояви патриотизм, поставь нашу отечественную таймзону.

BTW, в 8.2 (а не в 8-STABLE) патча может и не быть.

по PDT там дата релиза выводится (uname -v)
а зона стоит вот какая
ws99# date
Sun Oct 30 19:00:16 NOVT 2011

а на часах сейчас 20:00

Если ты дерево портов имеешь, то
portsnap fetch
portsnap update
cd /usr/ports/misc/zoneinfo
make && make install
tzsetup (или руками cp что-надо /etc/localtime)

Лёш, честно говоря оно меня не парит абсолютно
для файлопомойки это дело сто восьмое
я согласен вообще на любое время если они скорость по сети поднимут ;)
я так думаю в очередном релизе ФРИНАСа (8.10), они это поправят

В FreeBSD 9.0-RC1 таймзона точно новая.

А я тупо пробил в php.ini date.timezone = Etc/GMT-4.

С юзерскими таймзонами, конечно, сложнее.

Почему минус, должен же быть плюс?

Но я не настолько знаю php, чтобы до этого допереть. А в документации там примеры вроде Europe/Moscow

Методы дедукции и научного тыка показали, что именование там идентично путям относительно /usr/share/zoneinfo. Видимо, из оттуда и таскают с собой, осталось только понять, ЗАЧЕМ.

Почему минус, я сам не понял, но системные Etc/GMT* в этом плане у меня ведут себя так же. Теория относительности - штука сложная :)

ЗАЧЕМ - мне тоже непонятно.

Хм,а у тебя tz в конфиге прописан/выставлен ручками?
Я вот смотрю в php-fpm который запущен еще в начале октября (bla.txt получен из wget'а):

root@fr01-raid:~# lynx --dump -force_html /tmp/bla.txt|grep -i timezone
"Olson" Timezone Database Version 2011.8
Timezone Database internal
Default timezone Europe/Moscow
date.timezone no value no value
root@fr01-raid:~# lynx --dump -force_html /tmp/bla.txt|tail -n 11|head -n 3
now data data:
string(31) "Mon, 31 Oct 2011 00:36:35 +0400" string(8) "00:36:35"
string(31) "Mon, 31 Oct 2011 00:36:35 +0400" string(8) "00:36:35"
root@fr01-raid:~# date
Mon Oct 31 00:36:42 MSK 2011

вывод этот отсюда:

<?php
phpinfo();
echo "now data data:";

var_dump(date('r'), date('H:i:s'));
$date = new DateTime(null, new DateTimeZone('Etc/GMT-4')); $tz = $date->getTimezone();
var_dump($date->format('r'), $date->format('H:i:s'));

?>
И вроде бы все правильно, но я для этого ничего не делал, стандартно обновил таймзону на сервере только. Может я куда-то не туда смотрю?

Может быть в timezone database 2011.8 уже все нормально? Я не проверял, если честно...

всё несколько прозаичнее:

coolcold@fr01-raid:/tmp/keke1$ zcat /usr/share/doc/php5-common/README.Debian.gz |tail -n +122|head -n 6
Timezone data from system timezone database
---------------------------------------------------------------------

Debian PHP has been patched to use of the system wide timezone database
from the tzdata package, making sure any updates there are automatically
used by PHP aswell.

Молодцы, могу только похвалить.

Кстати, кто бы в FreeBSD такой патчик закоммитил/запиарил.

Спасибо за информацию, порт misc/pecl-timezonedb поправлен.

Жаль только не разошелся по зеркалам еще, по ходу.
Съэкономило бы кучу времени...
На свежайших портах - старая timezonedb.

portsnap fetch && portsnap update
сделал все в лучшем виде (но на 8 часов позже вашего комментария, может уже расползлось)

Да, теперь по ходу работает...
Тем более, что даже мой комментарий был на 4 часа позже реального времени, когда я пытался обновиться через порты.

Кто ж блин знал, что эти упыри захардкодили timezonedb.
Кто им мешает использовать системную?
Время php не совпадает с временем ОС.
Я думал совсем крыша поехала.
Под FreeBSD 8 обновляю php52 -> php53 - время нормальное.
Возвращаю назад - слетает.
Всю голову сломал.
Если не возражаете - перепечатаю у себя со ссылкой.

СПАСИБО!
за решение...

У меня почему-то на одном из серверов и php 5.3.8 казала неверное время. Не разбирался в чем причина, накатил pecl-timezonedb и успокоился.

Есть сервер. Старинный. На нем ПХП 5.Х.Х
Естественно проблема с переводом (вернее с его отсутствием)
Что делать, если нет возможности пересобирать апач и пхп?
Можно где-то ручками в файлике поправить, чтобы ПХП брал нормальную таймзону для МСК?

Либо pecl-timezonedb
Либо поставить сейшельские острова или кого-то подобного, у кого +0400 и нет перевода часов на лето.

Во FreeBSD паченный PHP и если собрать 5.2.17_4 с backports patch то все хорошо