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 onde o fuso horário usado pelo PostgreSQL é GMT, apesar de todo o sistema ser "Europa / Viena". Verifiquei novamente que postgresql.conf não não contém a configuração timezone , portanto, de acordo com a documentação, ela deve retornar ao fuso horário do sistema.

No entanto,

# 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 o fuso horário GMT poderia vir? O usuário do sistema não tem TZ set e o /etc/timezone e /etc/timeinfo parecem estar configurados corretamente.

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

Quaisquer sugestões são apreciadas, obrigado antecipadamente!

    
por Martin C. 12.11.2013 / 09:17

2 respostas

24

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

(..) If not explicitly set, the server initializes this variable to the time zone specified by its system environment. (...)

(...) The built-in default is GMT, but that is typically overridden in postgresql.conf; initdb will install a setting there corresponding to its system environment. (...)

O que significa que, antes da versão 9.2, o valor padrão em postgresql.conf deveria ser definido durante initdb phase. Se você tiver substituído esse valor (provavelmente copiando o antigo postgresql.conf ao atualizar de versões mais antigas), o PostgreSQL usará o valor "GMT" como padrão.

A solução para o seu caso é bastante simples, basta alterar a configuração TimeZone em postgresql.conf para o valor desejado:

TimeZone = 'Europe/Vienna'

Depois disso, você precisa reload do serviço:

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

Em seguida, todos os campos armazenados como timestamp with time zone (ou timestamptz ) serão exibidos corretamente a partir de agora. Mas você terá que corrigir com a mão todos (atualizar) os campos armazenados como timestamp without time zone (ou timestamp ).

Uma dica que dou para todos atualizar o PostgreSQL é não copiar o antigo postgresql.conf para o novo cluster (note que não tenho certeza se foi o que você fez, mas eu vi muito esse mesmo problema por causa disso) . Basta pegar o gerado por initdb e adicionar as modificações (uma ferramenta diff pode ser útil para essa tarefa).

    
por 12.11.2013 / 11:21
0

Eu encontrei uma solução para isso.

apenas crie um symlink dentro de / usr / share / zoneinfo / chamado localtime (ou qualquer nome que você deseje) apontando para / etc / localtime

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

Dessa forma, você cria uma sequência de links que, por fim, aponta 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";

    
por 26.07.2018 / 00:35