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

17

У меня есть несколько установок 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

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

Мартин С.
источник

Ответы:

24

Значение по умолчанию для 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и добавьте модификации ( diffинструмент может быть полезен для этой задачи).

MatheusOl
источник
Большое спасибо, я не заметил этого изменения с 9.1 на 9.2. Да, добавление информации о часовом поясе в postgresql.conf - это тривиальное исправление, я просто не могу объяснить, почему она возвращается к GMT. Видимо, я все время сталкивался с документацией 9.1, так как не ожидал такого радикального изменения с 9.1 до 9.2 в поведении по умолчанию.
Мартин С.
Ваша база данных всегда должна быть в формате UTC (GMT). Делает времена легче сравнивать. Всегда можете изменить часовой пояс клиента / сеанса. Установите часовой пояс х в pg. stackoverflow.com/questions/2532729/…
Нил Макгиган
Есть ли способ указать postgresql.confдля версии 9.2+, что часовой пояс системного окружения все равно должен автоматически определяться?
Кайл Стрэнд
0

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

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

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

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

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

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

TimeZone = 'localtime'

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

MatteoBee
источник