fuseau horaire par défaut de postgres

99

J'ai installé PostgreSQL 9et l'heure affichée est 1 heure de retard sur l'heure du serveur.

Exécution de Select NOW()spectacles:2011-07-12 11:51:50.453842+00

La date du serveur indique: Tue Jul 12 12:51:40 BST 2011

Il a 1 heure de retard mais le fuseau horaire indiqué dans phppgadminest:TimeZone Etc/GMT0

J'ai essayé d'entrer dans le postgresql.confdécor et

fuseau horaire = GMT

puis lancer un redémarrage mais pas de changement.

Des idées que je pensais qu'il aurait juste utilisé le fuseau horaire du serveur mais évidemment pas?!

SOLUTION!: Je l'ai fait GMTavant et il y avait une heure de retard. après avoir cherché, il s'est avéré que je devais le régler Europe/London. Cela prend en compte le +1 heure de l'heure d'été britannique, pas GMT!

Tours Blu
la source

Réponses:

113

Le fuseau horaire est un paramètre de session. Ainsi, vous pouvez modifier le fuseau horaire de la session en cours.

Voir la doc .

set timezone TO 'GMT';

Ou, en suivant de plus près le standard SQL, utilisez la SET TIME ZONEcommande. Remarquez deux mots pour "FUSEAU HORAIRE" où le code ci-dessus utilise un seul mot "fuseau horaire".

SET TIME ZONE 'UTC';

Le doc explique la différence:

SET TIME ZONE étend la syntaxe définie dans la norme SQL. La norme n'autorise que des décalages de fuseau horaire numériques tandis que PostgreSQL permet des spécifications de fuseau horaire plus flexibles. Toutes les autres fonctionnalités SET sont des extensions PostgreSQL.

Muhammad Usama
la source
2
J'ai essayé de définir cela et cela ne semblait pas fonctionner, mais cela ne le définissait pas uniquement pour la session active. Je souhaite le changer définitivement pour toutes les bases de données ect, je l'ai fait facilement dans phpmyadmin mais je n'arrive pas à trouver un moyen de le faire pour postgresql
Blu Towers
yup 'set timezone To ..' définit uniquement le fuseau horaire de la session en cours et si vous modifiez le paramètre de configuration du fuseau horaire dans Postgresql.conf, il devrait changer le fuseau horaire pour toutes les bases de données.
Muhammad Usama
4
J'ai essayé de changer le fuseau horaire en GMT dans postgresql.conf et cela semble fonctionner correctement.
Muhammad Usama
Plus standard (conforme à la SQL) est deux mots pour "TIME ZONE": SET TIME ZONE 'UTC';. Voir la doc .
Basil Bourque
103

Choisissez un timezoneparmi:

SELECT * FROM pg_timezone_names;

Et setcomme ci-dessous l'exemple donné:

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

Utilisez votre nom de base de données à la place de postgresdans l'instruction ci-dessus.

Iurii Perevertailo
la source
4
Vous devez redémarrer le service postgresql une fois que cela est fait
Joey Pinto
24
@JoeyPinto pas vrai, il suffit d'émettre SELECT pg_reload_conf();:)
Alphaaa
4
J'ai exécuté l'instruction avec le nom de ma base de données et j'ai SELECT pg_reload_conf()renvoyé true, mais now()et je select current_setting('TIMEZONE')continue à renvoyer des valeurs pour «America / New_York». Est-ce parce que je ne suis pas superutilisateur?
Noumenon
48

Pour effectuer le changement de fuseau horaire dans Postgres 9.1, vous devez:

1.- Recherchez dans votre dossier "timezones" dans /usr/share/postgresql/9.1/ le fichier approprié, dans mon cas serait "America.txt", recherchez l'emplacement le plus proche de votre zone et copiez le premières lettres dans la colonne de gauche.

Par exemple: si vous êtes à "New York" ou "Panama", ce serait "EST":

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

2.- Décommentez la ligne "fuseau horaire" dans votre postgresql.conffichier et mettez votre fuseau horaire comme indiqué:

#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.- Redémarrez Postgres

guerrerocarlos
la source
3
C'est en fait la bonne réponse car elle rend le changement de TZ par défaut pour chaque processus dans PGSQL, pas seulement pour l'utilisateur actuel.
jfreak53
15
Je vous suggère d' éviter complètement ces codes à 3 ou 4 lettres . Ils ne sont ni standardisés ni uniques. À la place, utilisez des noms de fuseaux horaires appropriés (continent SLASH ville ou région). Pour utiliser votre propre exemple, le Panama utilise un décalage toute l' −05:00année tandis que New York décale d'une heure avec l'heure d'été (DST). Un fuseau horaire est plus qu'un décalage; un fuseau horaire inclut l'ensemble passé, présent et futur de règles et d'anomalies telles que l'heure d'été. Alors, dites ce que vous voulez dire: America/Panama, America/New_York, Europe/London, UTC(ou Zulu).
Basil Bourque
3
Selon la documentation PostGRE , vous pouvez vérifier une vue interne pour obtenir une liste des noms de fuseau horaire reconnus dans votre base de données spécifique en faisant SELECT * FROM pg_timezone_namesce qui est probablement plus sûr à faire, étant donné que les sites tiers ne seront pas nécessairement aussi à jour (ou obsolète) comme votre propre instance de base de données.
SeldomNeedy
Je n'ai pas ce dossier en partagepostgresql
SuperUberDuper
Au lieu de redémarrer PostgreSQL, vous pouvez exécuter select pg_reload_conf().
ANeves
42

La réponse acceptée par Muhammad Usama est correcte.

Nom du paramètre de configuration

Cette réponse montre comment définir un paramètre de configuration spécifique à Postgres avec les éléments suivants:

SET timezone TO 'UTC';

… Où timezonen'est pas une commande SQL, c'est le nom du paramètre de configuration.

Voir le doc pour cela .

Commande SQL standard

Vous pouvez également utiliser la commande SQL défini par la spécification SQL: SET TIME ZONE. Dans cette syntaxe, une paire de mots TIME ZONEremplace «timezone» (commande SQL réelle par rapport au nom du paramètre), et il n'y a pas de «TO».

SET TIME ZONE 'UTC';

Cette commande et celle ci-dessus ont le même effet, pour définir la valeur pour la session en cours uniquement. Pour rendre le changement permanent, consultez cette réponse de votre frère .

Voir le doc pour cela .

Nom du fuseau horaire

Vous pouvez spécifier un nom de fuseau horaire approprié . La plupart d'entre eux sont continent / région.

SET TIME ZONE 'Africa/Casablanca';

…ou…

SET TIME ZONE 'America/Montreal';

Évitez les abréviations à 3 ou 4 lettres telles que ESTou ISTcar elles ne sont ni standardisées ni uniques. Voir Wikipedia pour la liste des noms de fuseaux horaires .

Obtenir la zone actuelle

Pour afficher le fuseau horaire actuel d'une session, essayez l'une des instructions suivantes. Techniquement, nous appelons la SHOWcommande pour afficher un paramètre d'exécution.

SHOW timezone ;

…ou…

SHOW time zone ;

États-Unis / Pacifique

Basil Bourque
la source
4
point bonus pour être la seule réponse à fournir la SHOWpièce
Ariel Allon
Roger ça, Ariel Allon - et, pour le prochain gars qui veut sélectionner ce fuseau horaire dans une variable ...SELECT current_setting('TIMEZONE')
Wellspring
10

En plus des réponses précédentes, si vous utilisez l'outil pgAdmin III, vous pouvez définir le fuseau horaire comme suit:

  1. Ouvrez la configuration de Postgres via Outils> Configuration du serveur> postgresql.conf
  2. Recherchez le fuseau horaire d' entrée et double-cliquez pour ouvrir
  3. Changer la valeur
  4. Recharger le serveur pour appliquer les modifications de configuration (bouton Lecture en haut ou via les services)

Configuration de Postgres dans pgAdmin III

Pascal
la source
3

Notez que de nombreux clients tiers ont leurs propres paramètres de fuseau horaire qui chevauchent tous les paramètres de serveur et / ou de session Postgres.

Par exemple, si vous utilisez 'IntelliJ IDEA 2017.3' (ou DataGrips), vous devez définir le fuseau horaire comme suit:

'Propriétés de la source de base de données' -> onglet 'Avancé' -> 'Options VM': -Duser.timezone = UTC + 06: 00

sinon, vous verrez «UTC» malgré tout ce que vous avez défini ailleurs.

ARA1307
la source
donc cela doit être synchronisé avec les changements d'heure été / hiver?
Cpt. Senkfuss
1
@ Cpt.Senkfuss, je crois que quelque chose comme -Duser.timezone = Australie / Tasmanie devrait également fonctionner et prendre en charge les changements été / hiver.
ARA1307
C'est un truc qui sauve la vie. J'ai essayé de comprendre ce qui ne va pas depuis 3 heures maintenant :) btw, j'ai essayé le nom complet du fuseau horaire et cela fonctionne. pour moi c'est -Duser.timezone = Europe / Istanbul
Olgun Kaya
0

Peut-être pas lié à la question, mais j'avais besoin d'utiliser CST, de définir le fuseau horaire du système sur le tz souhaité (Amérique / ...), puis dans la conf postgresql, définir la valeur du fuseau horaire sur `` heure locale '' et cela a fonctionné comme un charme , current_time imprimant le bon moment (PostgreSQL 9.5 sur Ubuntu 16)

MGrillo
la source