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!

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.


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.


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


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


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


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.


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)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.