Назад | Перейти на главную страницу

Часовой пояс PostgreSQL не соответствует системному часовому поясу

У меня есть несколько установок PostgreSQL 9.2, в которых часовой пояс, используемый PostgreSQL, - GMT, несмотря на то, что вся система - «Европа / Вена». Я перепроверил это postgresql.conf делает не содержать timezone параметр, поэтому согласно документации он должен вернуться к часовому поясу системы.

Тем не мение,

# su -s /bin/bash postgres -c "psql mydb"

mydb=# show timezone;
 TimeZone 
----------
 GMT
(1 row)

mydb=# select now();
              now              
-------------------------------
 2013-11-12 08:14:21.697622+00
(1 row)

Любые подсказки, откуда может взяться часовой пояс GMT? Системный пользователь не имеет TZ набор и /etc/timezone и /etc/timeinfo вроде настроен правильно.

# cat /etc/timezone 
Europe/Vienna
# date
Tue Nov 12 09:15:42 CET 2013

Любые подсказки приветствуются, заранее спасибо!

Значение по умолчанию для TimeZone настройка изменилась в версии 9.2:

(..) Если не задано явно, сервер инициализирует эту переменную часовым поясом, указанным в его системной среде. (...)

(...) Встроенное значение по умолчанию - GMT, но обычно оно отменяется в postgresql.conf; initdb установит туда параметр, соответствующий его системной среде. (...)

Это означает, что до версии 9.2 значение по умолчанию в postgresql.conf должен быть установлен во время initdb фаза. Если вы переопределите это значение (возможно, скопировав старый postgresql.conf при обновлении со старых версий) PostgreSQL будет использовать значение «GMT» по умолчанию.

Решение для вашего случая довольно простое, просто измените TimeZone установка на postgresql.conf к желаемому значению:

TimeZone = 'Europe/Vienna'

После этого вам нужно reload сервис:

# su - postgres -c "psql mydb -c 'SELECT pg_reload_conf()'"

Тогда все поля сохраняются как timestamp with time zone (или timestamptz) с этого момента будет отображаться правильно. Но вам придется вручную исправить все (обновить) поля, хранящиеся как timestamp without time zone (или timestamp).

Совет, который я даю всем, кто обновляет PostgreSQL, - не копировать старые postgresql.conf в новый кластер (обратите внимание, я не уверен, что вы сделали, но я часто видел ту же самую проблему из-за этого). Просто получите тот, сгенерированный initdb и добавить модификации (a diff инструмент может быть полезен для этой задачи).

Я нашел обходной путь для этого.

просто создайте символическую ссылку внутри / usr / share / zoneinfo / названный местное время (или любое другое имя по вашему желанию), чтобы указать на / etc / localtime

/usr/share/zoneinfo/localtime -> /etc/localtime

таким образом вы создаете цепочку ссылок, которая в конечном итоге указывает на часовой пояс вашей системы.

/etc/localtime -> /usr/share/zoneinfo/America/Los_Angeles

Теперь возьмите имя созданной ссылки (местное время в моем случае) и использовать его как значение элемента конфигурации в postgresql.conf

TimeZone = 'localtime'

перезапустите postgresql и проверьте время с помощью «SELECT now ();» и «показать часовой пояс»;