Il fuso orario di PostgreSQL non corrisponde al fuso orario del sistema


17

Ho diverse installazioni PostgreSQL 9.2 in cui il fuso orario utilizzato da PostgreSQL è GMT, nonostante l'intero sistema sia "Europa / Vienna". Ho controllato due volte che postgresql.confsi fa non contengono timezoneimpostazione, quindi in base alla documentazione dovrebbe ripiego al fuso orario del sistema.

Tuttavia,

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

Qualche suggerimento, da dove potrebbe provenire il fuso orario GMT? L'utente del sistema non ha TZimpostato /etc/timezonee /etc/timeinfosembra essere configurato correttamente.

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

Eventuali suggerimenti sono apprezzati, grazie in anticipo!

Risposte:


24

Il valore predefinito per l' TimeZoneimpostazione è cambiato alla versione 9.2:

(..) Se non impostato esplicitamente, il server inizializza questa variabile sul fuso orario specificato dal suo ambiente di sistema. (...)

(...) L'impostazione predefinita predefinita è GMT, ma in genere viene sovrascritta in postgresql.conf; initdb installerà lì un'impostazione corrispondente al suo ambiente di sistema. (...)

Ciò significa che prima della versione 9.2 il valore predefinito at postgresql.confdovrebbe essere impostato durante la initdbfase. Se hai ignorato quel valore (probabilmente copiando il vecchio postgresql.confmentre esegui l'aggiornamento da versioni precedenti) PostgreSQL utilizzerà il valore "GMT" come predefinito.

La soluzione per il tuo caso è abbastanza semplice, basta cambiare l' TimeZoneimpostazione sul postgresql.confvalore desiderato:

TimeZone = 'Europe/Vienna'

Successivamente è necessario reloadil servizio:

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

Quindi d'ora in poi tutti i campi memorizzati come timestamp with time zone(o timestamptz) verranno visualizzati correttamente. Ma dovrai correggere a mano tutti (aggiornare) i campi memorizzati come timestamp without time zone(o timestamp).

Un consiglio che do a tutti coloro che aggiornano PostgreSQL non è quello di copiare il vecchio postgresql.confnel nuovo cluster (nota che non sono sicuro che sia quello che hai fatto, ma ho visto lo stesso problema molto per questo). Basta ottenere quello generato da initdbe aggiungere le modifiche (uno diffstrumento può essere una manciata per questo compito).


Grazie mille, non ho notato questo cambiamento da 9.1 a 9.2. Sì, aggiungere le informazioni sul fuso orario a postgresql.conf è una soluzione banale, non riuscivo proprio a spiegare perché sarebbe ricaduto su GMT. Apparentemente mi sono sempre imbattuto nella documentazione 9.1, poiché non mi sarei aspettato un cambiamento così radicale da 9,1 a 9,2 nel comportamento predefinito.
Martin C.,

Tuttavia, il database dovrebbe essere sempre in UTC (GMT). Rende i tempi più facili da confrontare. Può sempre cambiare il fuso orario del client / della sessione. Imposta fuso orario x in pag. stackoverflow.com/questions/2532729/…
Neil McGuigan

Esiste un modo per specificare postgresql.confper la versione 9.2+ che il fuso orario dell'ambiente di sistema debba ancora essere rilevato automaticamente?
Kyle Strand,

0

Ho trovato una soluzione per questo.

basta creare un collegamento simbolico all'interno di / usr / share / zoneinfo / denominato localtime (o qualunque sia il nome che si desidera) per puntare a / etc / localtime

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

in questo modo stai creando una serie di collegamenti che alla fine punta al fuso orario del tuo sistema.

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

Ora prendi il nome del link che hai creato ( localtime nel mio caso) e usalo come valore dell'elemento di configurazione in postgresql.conf

TimeZone = 'localtime'

riavvia postgresql e controlla l'ora con "SELEZIONA ora ();" e "mostra fuso orario;"

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.