fuso orario predefinito di postgres


99

Ho installato PostgreSQL 9e l'ora che viene visualizzata è di 1 ora indietro rispetto all'ora del server.

Select NOW()Spettacoli in esecuzione :2011-07-12 11:51:50.453842+00

La data del server mostra: Tue Jul 12 12:51:40 BST 2011

È indietro di 1 ora ma il fuso orario mostrato in phppgadminè:TimeZone Etc/GMT0

Ho provato ad entrare nell'impostazione postgresql.confe

fuso orario = GMT

quindi eseguire un riavvio ma nessuna modifica.

Qualche idea pensavo che avrebbe usato solo il fuso orario del server ma ovviamente no ?!

SOLUZIONE !: Ho impostato GMTprima ed era un'ora indietro. dopo aver cercato in giro risulta che avevo bisogno di impostarlo su Europe/London. Questo tiene conto dell'ora +1 nell'ora legale britannica, GMT no!

Risposte:


113

Il fuso orario è un parametro di sessione. Quindi, puoi cambiare il fuso orario per la sessione corrente.

Vedi il doc .

set timezone TO 'GMT';

Oppure, seguendo più da vicino lo standard SQL, utilizzare il SET TIME ZONEcomando. Notare due parole per "FUSO ORARIO" dove il codice precedente utilizza una sola parola "fuso orario".

SET TIME ZONE 'UTC';

Il documento spiega la differenza:

SET TIME ZONE estende la sintassi definita nello standard SQL. Lo standard consente solo offset di fuso orario numerici mentre PostgreSQL consente specifiche di fuso orario più flessibili. Tutte le altre funzionalità SET sono estensioni PostgreSQL.


2
Ho provato a impostarlo e non sembra funzionare, inoltre non lo imposta solo per la sessione attiva. Vorrei cambiarlo in modo permanente per tutti i database ecc., L'ho fatto facilmente in phpmyadmin ma non riesco a trovare un modo per farlo per postgresql
Blu Towers

yup 'set timezone To ..' imposta solo il fuso orario per la sessione corrente e se si modifica il parametro di configurazione del fuso orario in Postgresql.conf dovrebbe cambiare il fuso orario per tutti i database.
Muhammad Usama

4
Ho provato a cambiare il fuso orario in GMT in postgresql.conf e sembra funzionare bene.
Muhammad Usama

Più standard (compatibile SQL spec) è due parole per "Time Zone": SET TIME ZONE 'UTC';. Vedi il doc .
Basil Bourque

103

Scegli timezonetra:

SELECT * FROM pg_timezone_names;

E setcome di seguito dato esempio:

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

Usa il tuo nome DB al posto della postgresdichiarazione sopra.


4
È necessario riavviare il servizio postgresql dopo che questo è stato fatto
Joey Pinto

24
@JoeyPinto non è vero, è sufficiente emettere SELECT pg_reload_conf();:)
Alphaaa

4
Ho eseguito la dichiarazione con il mio nome del database e SELECT pg_reload_conf()tornato vero, ma now()e select current_setting('TIMEZONE')continuo a restituire i valori per 'America / New_York'. È perché non sono un superutente?
Noumenon

48

Per completare il cambio di fuso orario in Postgres 9.1 devi:

1.- Cerca nella cartella "timezones" in /usr/share/postgresql/9.1/ il file appropriato, nel mio caso sarebbe "America.txt", cerca la posizione più vicina alla tua zona e copia il prime lettere nella colonna di sinistra.

Ad esempio: se ti trovi a "New York" o "Panama" sarebbe "EST":

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

2.- Rimuovi il commento dalla riga "timezone" nel postgresql.conffile e inserisci il tuo fuso orario come mostrato:

#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.- Riavvia Postgres


3
Questa è in realtà la risposta corretta in quanto rende il cambio TZ predefinito per ogni processo in PGSQL, non solo per l'utente corrente.
jfreak53

15
Ti suggerisco di evitare del tutto quei codici di 3 o 4 lettere . Non sono né standardizzati né unici. Utilizzare invece nomi di fuso orario corretti (continente SLASH città o regione). Per usare il tuo esempio, Panama utilizza un offset di tutto l' −05:00anno mentre New York cambia un'ora con l'ora legale (DST). Un fuso orario è più di un offset; un fuso orario include il passato, il presente e il futuro insieme di regole e anomalie come l'ora legale. Quindi, dire quello che vuoi dire: America/Panama, America/New_York, Europe/London, UTC(o Zulu).
Basil Bourque

3
Come per i documenti di PostGRE , puoi controllare una vista interna per ottenere un elenco dei nomi dei fusi orari riconosciuti nel tuo database specifico facendo il SELECT * FROM pg_timezone_namesche è probabilmente più sicuro da fare, dato che i siti di terze parti non saranno necessariamente aggiornati (o non aggiornato) come la tua particolare istanza di database.
Raramente

Non ho quella cartella in condivisionepostgresql
SuperUberDuper

Invece di riavviare PostgreSQL, puoi eseguire select pg_reload_conf().
Aneves

42

La risposta accettata da Muhammad Usama è corretta.

Nome parametro di configurazione

Quella risposta mostra come impostare un parametro di configurazione specifico di Postgres con quanto segue:

SET timezone TO 'UTC';

... dove timezonenon è un comando SQL, è il nome del parametro di configurazione.

Vedi il documento per questo .

Comando SQL standard

In alternativa, è possibile utilizzare il comando SQL definito dalle specifiche SQL: SET TIME ZONE. In questa sintassi una coppia di parole TIME ZONEsostituisce "timezone" (comando SQL effettivo rispetto al nome del parametro) e non c'è "TO".

SET TIME ZONE 'UTC';

Sia questo comando che quello sopra hanno lo stesso effetto, per impostare il valore solo per la sessione corrente. Per rendere permanente la modifica, vedere questa risposta di pari livello .

Vedi il documento per questo .

Nome fuso orario

È possibile specificare un nome di fuso orario appropriato . La maggior parte di questi sono continenti / regioni.

SET TIME ZONE 'Africa/Casablanca';

…o…

SET TIME ZONE 'America/Montreal';

Evita le abbreviazioni di 3 o 4 lettere come ESTo ISTpoiché non sono né standardizzate né uniche. Vedi Wikipedia per l' elenco dei nomi dei fusi orari .

Ottieni la zona corrente

Per vedere il fuso orario corrente per una sessione, prova una delle seguenti istruzioni. Tecnicamente stiamo chiamando il SHOWcomando per visualizzare un parametro di runtime.

SHOW timezone ;

…o…

SHOW time zone ;

Stati Uniti / Pacifico


4
punto bonus per essere l'unica risposta a fornire la SHOWparte
Ariel Allon

Roger quello, Ariel Allon - e, per il prossimo ragazzo che vuole selezionare quel fuso orario in una variabile ...SELECT current_setting('TIMEZONE')
Wellspring

10

Oltre alle risposte precedenti, se utilizzi lo strumento pgAdmin III puoi impostare il fuso orario come segue:

  1. Apri Postgres config tramite Strumenti> Configurazione server> postgresql.conf
  2. Cerca il fuso orario della voce e fai doppio clic per aprire
  3. Cambia il valore
  4. Ricarica il server per applicare le modifiche alla configurazione (pulsante Riproduci in alto o tramite servizi)

Configurazione di Postgres in pgAdmin III


3

Nota che molti client di terze parti hanno le proprie impostazioni del fuso orario che si sovrappongono a qualsiasi server Postgres e \ o impostazioni di sessione.

Ad esempio, se stai utilizzando "IntelliJ IDEA 2017.3" (o DataGrips), dovresti definire il fuso orario come:

"Proprietà origine database" -> scheda "Avanzate" -> "Opzioni VM": -Duser.timezone = UTC + 06:00

altrimenti vedrai "UTC" nonostante tutto ciò che hai impostato altrove.


quindi questo deve essere mantenuto sincronizzato con i cambiamenti dell'ora legale / invernale?
Cpt. Senkfuss

1
@ Cpt.Senkfuss, credo che qualcosa come -Duser.timezone = Australia / Tasmania dovrebbe funzionare e prendersi cura dei cambiamenti estate \ inverno.
ARA1307

Questo è un trucco salvavita. Ho provato a capire cosa potrebbe esserci di sbagliato ormai da 3 ore :) btw, ho provato il nome completo del fuso orario e funziona. per me è -Duser.timezone = Europe / Istanbul
Olgun Kaya

0

Forse non correlato alla domanda, ma dovevo usare CST, impostare il fuso orario di sistema sulla tz desiderata (America / ...) e quindi in postgresql conf impostare il valore del fuso orario su 'localtime' e ha funzionato come un fascino , current_time stampa l'ora giusta (Postgresql 9.5 su Ubuntu 16)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.