У меня есть несколько установок 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 ();» и «показать часовой пояс»;