Полная копипаста с сайта opennet.ru.
Оригинал статьи: http://www.opennet.ru/tips/2639_postgresql_timezone_zoneinfo.shtml
В PostgreSQL используется своя внутренняя таблица временных зон (postgresql-x.x.x/src/timezone), поэтому обновление системной базы zoneinfo не повлияет на перевод часов в PostgreSQL.
Смотрим текущее состояние:
SELECT * FROM pg_timezone_names;
Europe/Moscow | MSK | 03:00:00 | f
Как видим часы перевелись и используется смещение +3 вместо +4.
SELECT now();
2011-11-01 11:00:19.834213+03
SELECT now()-'6 days'::interval;
2011-10-26 11:00:52.155833+04
Копируем актуальные данные из обновлённой в системе базы часовых поясов. База часовых поясов в PostgreSQL может оказаться в /usr/local/share/pgsql/timezone
,
/usr/share/pgsql/timezone
или /usr/local/pgsql/share/timezone/
. Например:
cp -f /usr/share/zoneinfo/Europe/Moscow /usr/share/pgsql/timezone/Europe/Moscow
После этого "SELECT * FROM pg_timezone_names" отобразит изменения, но чтобы они подействовали обязательно требуется перезапустить PostgreSQL.
Для изменения часового пояса для конкретной БД можно использовать конструкцию:
ALTER DATABASE mydb SET timezone TO 'Asia/Yekaterinburg';
Из других подводных камней, которые обнаружились при отмене перехода на зимнее время можно упомянуть забытое обновление /etc/localtime
в chroot-окружениях.
Комментарии
oermolaev
#cid7363
Ответить
Навело на мысль почему в моем клиенте сетевого чата IChat время уже давно на час назад. Проблему решил. Спасибо.