fuso horário padrão do postgres

99

Instalei PostgreSQL 9e o horário que ele está mostrando está 1 hora atrasado em relação ao horário do servidor.

Programas em execução Select NOW():2011-07-12 11:51:50.453842+00

A data do servidor mostra: Tue Jul 12 12:51:40 BST 2011

Está 1 hora atrasado, mas o fuso horário mostrado em phppgadminé:TimeZone Etc/GMT0

Eu tentei entrar na postgresql.confconfiguração e

fuso horário = GMT

em seguida, reiniciando, mas sem alterações.

Alguma ideia que pensei que apenas usaria o fuso horário do servidor, mas obviamente não ?!

SOLUÇÃO !: Configurei para GMTantes e estava uma hora atrasado. após pesquisar descobri que eu precisava configurá-lo para Europe/London. Isso leva em consideração a hora +1 no horário de verão britânico, o GMT não!

Blu Towers
fonte

Respostas:

113

O fuso horário é um parâmetro de sessão. Portanto, você pode alterar o fuso horário da sessão atual.

Veja o doc .

set timezone TO 'GMT';

Ou, seguindo mais de perto o padrão SQL, use o SET TIME ZONEcomando. Observe duas palavras para "TIME ZONE" onde o código acima usa uma única palavra "timezone".

SET TIME ZONE 'UTC';

O doc explica a diferença:

SET TIME ZONE estende a sintaxe definida no padrão SQL. O padrão permite apenas deslocamentos numéricos de fuso horário, enquanto o PostgreSQL permite especificações de fuso horário mais flexíveis. Todos os outros recursos do SET são extensões do PostgreSQL.

Muhammad Usama
fonte
2
Eu tentei definir isso e não parecia funcionar, também não define apenas para a sessão ativa. Desejo mudá-lo permanentemente para todos os bancos de dados etc. Fiz isso facilmente no phpmyadmin, mas não consigo encontrar uma maneira de fazer isso para o postgresql
Blu Towers
yup 'set timezone To ..' apenas define o fuso horário para a sessão atual e se você alterar o parâmetro de configuração de fuso horário no Postgresql.conf, ele deve alterar o fuso horário para todos os bancos de dados.
Muhammad Usama
4
Tentei alterar o fuso horário para GMT em postgresql.conf e parece estar funcionando bem.
Muhammad Usama
Mais padrão (compatível com SQL especificação) é duas palavras para "TIME ZONE": SET TIME ZONE 'UTC';. Veja o doc .
Basil Bourque
102

Escolha um timezonede:

SELECT * FROM pg_timezone_names;

E setconforme o exemplo abaixo dado:

ALTER DATABASE postgres SET timezone TO 'Europe/Berlin';

Use seu nome de banco de dados no lugar da postgresdeclaração acima.

Iurii Perevertailo
fonte
4
Você precisa reiniciar o serviço postgresql depois que isso for feito
Joey Pinto
24
@JoeyPinto não é verdade, basta emitir SELECT pg_reload_conf();:)
Alphaaa
4
Corri a declaração com o meu nome de banco de dados e SELECT pg_reload_conf()retornou verdade, mas now()e select current_setting('TIMEZONE')continuar a valores de retorno para 'America / New_York'. É porque não sou superusuário?
Noumenon
48

Para realizar a mudança de fuso horário no Postgres 9.1, você deve:

1.- Pesquise na pasta "fusos horários" em /usr/share/postgresql/9.1/ o arquivo adequado, no meu caso seria "America.txt", nele procure o local mais próximo da sua zona e copie o primeiras letras na coluna da esquerda.

Por exemplo: se você estiver em "Nova York" ou "Panamá", seria "EST":

#  - EST: Eastern Standard Time (Australia)
EST    -18000    # Eastern Standard Time (America)
                 #     (America/New_York)
                 #     (America/Panama)

2.- Descomente a linha "fuso horário" em seu postgresql.confarquivo e coloque seu fuso horário conforme mostrado:

#intervalstyle = 'postgres'
#timezone = '(defaults to server environment setting)'
timezone = 'EST'
#timezone_abbreviations = 'EST'     # Select the set of available time zone
                                        # abbreviations.  Currently, there are
                                        #   Default
                                        #   Australia

3.- Reinicie o Postgres

guerrerocarlos
fonte
3
Na verdade, esta é a resposta correta, pois torna a alteração TZ padrão para todos os processos em PGSQL, não apenas para o usuário atual.
jfreak53
15
Eu sugiro que você evite esses códigos de 3 ou 4 letras completamente. Eles não são padronizados nem exclusivos. Em vez disso, use nomes de fuso horário adequados (continente SLASH cidade ou região). Para usar seu próprio exemplo, o Panamá usa um deslocamento do −05:00ano todo, enquanto Nova York muda uma hora com o horário de verão (DST). Um fuso horário é mais do que um deslocamento; um fuso horário inclui o passado, presente e futuro conjunto de regras e anomalias, como DST. Então, digamos que você quer dizer: America/Panama, America/New_York, Europe/London, UTC(ou Zulu).
Basil Bourque
3
De acordo com os documentos do PostGRE , você pode verificar uma visão interna para obter uma lista dos nomes de fuso horário reconhecidos em seu banco de dados específico, fazendo o SELECT * FROM pg_timezone_namesque provavelmente é mais seguro, pois sites de terceiros não serão necessariamente tão atualizados (ou desatualizado) como sua própria instância de banco de dados particular.
SeldomNeedy
Não tenho essa pasta no compartilhamentopostgresql
SuperUberDuper
Em vez de reiniciar o PostgreSQL, você pode executar select pg_reload_conf().
ANeves
42

A resposta aceita por Muhammad Usama está correta.

Nome do parâmetro de configuração

Essa resposta mostra como definir um parâmetro de configuração específico do Postgres com o seguinte:

SET timezone TO 'UTC';

… Onde timezonenão é um comando SQL, é o nome do parâmetro de configuração.

Veja o doc para isso .

Comando SQL Padrão

Alternativamente, você pode usar o comando SQL definido pela especificação SQL: SET TIME ZONE. Nesta sintaxe, um par de palavras TIME ZONEsubstitui "fuso horário" (comando SQL real versus nome do parâmetro) e não há "PARA".

SET TIME ZONE 'UTC';

Tanto este comando quanto o anterior têm o mesmo efeito, para definir o valor apenas para a sessão atual. Para tornar a mudança permanente, consulte a resposta deste irmão .

Veja o doc para isso .

Nome do Fuso Horário

Você pode especificar um nome de fuso horário adequado . A maioria deles é continente / região.

SET TIME ZONE 'Africa/Casablanca';

…ou…

SET TIME ZONE 'America/Montreal';

Evite as abreviações de 3 ou 4 letras , como ESTou ISTporque não são padronizadas nem exclusivas. Consulte a Wikipedia para obter uma lista de nomes de fusos horários .

Obter zona atual

Para ver o fuso horário atual de uma sessão, tente uma das seguintes instruções. Tecnicamente, estamos chamando o SHOWcomando para exibir um parâmetro de tempo de execução.

SHOW timezone ;

…ou…

SHOW time zone ;

EUA / Pacífico

Basil Bourque
fonte
4
ponto de bônus por ser a única resposta a fornecer a SHOWparte
Ariel Allon
Entendido, Ariel Allon - e, para o próximo cara que quiser selecionar aquele fuso horário em uma variável ...SELECT current_setting('TIMEZONE')
Wellspring
10

Além das respostas anteriores, se você usar a ferramenta pgAdmin III, você pode definir o fuso horário da seguinte forma:

  1. Abra a configuração do Postgres em Ferramentas> Configuração do servidor> postgresql.conf
  2. Procure o fuso horário de entrada e clique duas vezes para abrir
  3. Mudar o valor
  4. Recarregue o servidor para aplicar as alterações de configuração (botão Play na parte superior ou por meio dos serviços)

Configuração do Postgres no pgAdmin III

Pascal
fonte
3

Observe que muitos clientes de terceiros têm configurações de fuso horário próprias sobrepondo qualquer servidor Postgres e \ ou configurações de sessão.

Por exemplo, se você estiver usando 'IntelliJ IDEA 2017.3' (ou DataGrips), deve definir o fuso horário como:

'Propriedades de origem do banco de dados' -> guia 'Avançado' -> 'Opções de VM': -Duser.timezone = UTC + 06: 00

caso contrário, você verá 'UTC' independentemente de tudo o que tiver definido em qualquer outro lugar.

ARA1307
fonte
então isso precisa ser mantido em sincronia com as mudanças de horário de verão / inverno?
Cpt. Senkfuss de
1
@ Cpt.Senkfuss, acredito que algo como -Duser.timezone = Australia / Tasmania também deveria funcionar e cuidar das mudanças de verão / inverno.
ARA1307
Este é um truque que salva vidas. Eu tenho tentado entender o que pode estar errado por 3 horas agora :) btw, tentei o nome do fuso horário completo e funciona. para mim é -Duser.timezone = Europe / Istanbul
Olgun Kaya
0

Talvez não relacionado à questão, mas eu precisava usar o CST, definir o fuso horário do sistema para o tz desejado (América / ...) e, em seguida, na configuração do postgresql definir o valor do fuso horário para 'localtime' e funcionou como um encanto , current_time imprimindo na hora certa (Postgresql 9.5 no Ubuntu 16)

MGrillo
fonte