O fuso horário do PostgreSQL não corresponde ao fuso horário do sistema

17

Eu tenho várias instalações do PostgreSQL 9.2 em que o fuso horário usado pelo PostgreSQL é GMT, apesar de todo o sistema ser "Europa / Viena". Eu verifiquei que postgresql.confnão não contêm timezoneajuste, então de acordo com a documentação que deve recuar ao fuso horário do sistema.

Contudo,

# 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)

Alguma dica de onde poderia vir o fuso horário GMT? O usuário do sistema não TZdefiniu /etc/timezonee /etc/timeinfooe parece estar configurado corretamente.

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

Todas as dicas são apreciadas, obrigado antecipadamente!

Martin C.
fonte

Respostas:

24

O valor padrão para a TimeZoneconfiguração foi alterado na versão 9.2:

(..) Se não estiver definido explicitamente, o servidor inicializará essa variável no fuso horário especificado pelo ambiente do sistema. (...)

(...) O padrão interno é GMT, mas isso geralmente é substituído no postgresql.conf; O initdb instalará uma configuração correspondente ao seu ambiente de sistema. (...)

O que significa que, antes da versão 9.2, o valor padrão em postgresql.confdeveria ser definido durante a initdbfase. Se você substituiu esse valor (provavelmente copiando o antigo postgresql.confdurante a atualização de versões anteriores), o PostgreSQL usará o valor "GMT" como padrão.

A solução para o seu caso é bastante simples, basta alterar a TimeZoneconfiguração postgresql.confpara o valor desejado:

TimeZone = 'Europe/Vienna'

Depois disso, você precisa reloaddo serviço:

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

Todos os campos armazenados como timestamp with time zone(ou timestamptz) serão mostrados corretamente a partir de agora. Mas você terá que corrigir manualmente todos (atualizar) os campos armazenados como timestamp without time zone(ou timestamp).

Uma dica que dou a todos que estão atualizando o PostgreSQL é não copiar o antigo postgresql.confpara o novo cluster (observe que não tenho certeza se foi o que você fez, mas vi esse mesmo problema muito por causa disso). Basta obter o gerado por initdbe adicionar as modificações (uma diffferramenta pode ser um punhado para esta tarefa).

MatheusOl
fonte
Muito obrigado, não notei essa alteração da 9.1 para a 9.2. Sim, adicionar as informações de fuso horário ao postgresql.conf é uma correção trivial, eu simplesmente não conseguia explicar por que elas voltariam ao GMT. Aparentemente, eu me deparei com a documentação 9.1 o tempo todo, pois não esperava uma mudança tão radical de 9.1 a 9.2 no comportamento padrão.
Martin C.
Seu banco de dados sempre deve estar em UTC (GMT). Facilita a comparação dos tempos. Sempre pode alterar o fuso horário do cliente / sessão. Defina o fuso horário x na pág. stackoverflow.com/questions/2532729/…
Neil McGuigan
Existe alguma maneira de especificar postgresql.confpara a versão 9.2+ que o fuso horário do ambiente do sistema ainda deve ser detectado automaticamente?
Kyle Strand
0

Encontrei uma solução alternativa para isso.

basta criar um link simbólico dentro de / usr / share / zoneinfo / nomeado localtime (ou qualquer nome que você desejar) para apontar para / etc / localtime

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

Dessa maneira, você cria uma série de links que apontam para o fuso horário do seu sistema.

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

Agora pegue o nome do link que você criou ( localtime no meu caso) e use-o como o valor do item de configuração no postgresql.conf

TimeZone = 'localtime'

reinicie o postgresql e verifique a hora com "SELECT now ();" e "mostrar fuso horário";

MatteoBee
fonte