Le fuseau horaire de PostgreSQL ne correspond pas au fuseau horaire du système

17

J'ai plusieurs installations PostgreSQL 9.2 où le fuseau horaire utilisé par PostgreSQL est GMT, bien que l'ensemble du système soit "Europe / Vienne". J'ai revérifié qui postgresql.confne contient pas de timezoneparamètre, donc selon la documentation, il devrait revenir au fuseau horaire du système.

cependant,

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

Des indices, d'où le fuseau horaire GMT pourrait provenir? L'utilisateur système n'a pas TZdéfini et le /etc/timezoneet /etc/timeinfosemblent être configurés correctement.

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

Tous les indices sont appréciés, merci d'avance!

Martin C.
la source

Réponses:

24

La valeur par défaut du TimeZoneparamètre a changé dans la version 9.2:

(..) Si elle n'est pas définie explicitement, le serveur initialise cette variable au fuseau horaire spécifié par son environnement système. (...)

(...) La valeur par défaut intégrée est GMT, mais elle est généralement remplacée dans postgresql.conf; initdb y installera un paramètre correspondant à son environnement système. (...)

Ce qui signifie qu'avant la version 9.2, la valeur par défaut à postgresql.confdoit être définie pendant la initdbphase. Si vous avez remplacé cette valeur (probablement en copiant l'ancienne postgresql.conflors de la mise à niveau à partir d'anciennes versions), PostgreSQL utilisera la valeur "GMT" par défaut.

La solution pour votre cas est assez simple, modifiez simplement le TimeZoneparamètre sur postgresql.confla valeur souhaitée:

TimeZone = 'Europe/Vienna'

Après cela, vous avez besoin reloaddu service:

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

Ensuite, tous les champs stockés sous timestamp with time zone(ou timestamptz) s'afficheront désormais correctement. Mais vous devrez corriger à la main tous (mettre à jour) les champs stockés comme timestamp without time zone(ou timestamp).

Un conseil que je donne à tous ceux qui mettent à niveau PostgreSQL n'est pas de copier l'ancien postgresql.confvers le nouveau cluster (notez que je ne suis pas sûr si c'est ce que vous avez fait, mais j'ai vu ce même problème beaucoup à cause de cela). Obtenez simplement celui généré par initdbet ajoutez les modifications (un diffoutil peut être utile pour cette tâche).

MatheusOl
la source
Merci beaucoup, je n'ai pas remarqué ce changement de 9.1 à 9.2. Oui, l'ajout des informations de fuseau horaire à postgresql.conf est une correction triviale, je ne pouvais tout simplement pas expliquer pourquoi cela retomberait sur GMT. Apparemment, je suis tombé sur la documentation 9.1 tout le temps, car je ne m'attendais pas à un changement aussi radical de 9.1 à 9.2 dans le comportement par défaut.
Martin C.
Cependant, votre base de données doit toujours être en UTC (GMT). Rend les temps plus faciles à comparer. Peut toujours changer le fuseau horaire du client / session. Réglez le fuseau horaire x en p. stackoverflow.com/questions/2532729/…
Neil McGuigan
Existe-t-il un moyen de spécifier dans la postgresql.confversion 9.2+ que le fuseau horaire de l'environnement système doit toujours être détecté automatiquement?
Kyle Strand
0

J'ai trouvé une solution pour cela.

créez simplement un lien symbolique dans / usr / share / zoneinfo / nommé localtime (ou quel que soit le nom que vous souhaitez) pour pointer vers / etc / localtime

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

de cette façon, vous créez une chaîne de liens qui pointe finalement vers le fuseau horaire de votre système.

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

Prenez maintenant le nom du lien que vous avez créé ( heure locale dans mon cas) et utilisez-le comme valeur de l'élément de configuration dans postgresql.conf

TimeZone = 'localtime'

redémarrez postgresql et vérifiez l'heure avec "SELECT now ();" et "afficher le fuseau horaire";

MatteoBee
la source