J'essaye de déployer une application JS en utilisant TypeORM et Postgres sur un hôte. Localement, j'avais un Postgress DB fonctionnant donc dans ma propre TZ. L'hôte distant a son heure système réglée sur UTC:
> select ("lastUpdate" at time zone 'UTC' at time zone 'CEST') from myTable; 2019-10-07 12:00:00.000000
J'ai une table avec une date automatiquement mise à jour (ce qui signifie qu'elle se met à jour lorsque l'enregistrement est mis à jour).
XXX
Une ligne est insérée à 12h00 CEST:
> select ("lastUpdate" at time zone 'CEST') from myTable; 2019-10-07 08:00:00.000000+00 > select timezone('CEST', "lastUpdate") from myTable; 2019-10-07 08:00:00.000000+00
Je souhaite que la date apparaisse dans mon fuseau horaire (CEST) quel que soit de l'heure du serveur, il devrait donc me renvoyer 2019-10-07 12:00. Je préfère ne coder aucune astuce car cela devrait également fonctionner sur ma machine CEST.
Postgress a toutes les informations:
> show timezone; UCT
Je m'attendrais donc à ce qu'il soit facile de convertir ceci dans le format que j'ai demandé. Cependant, les exemples suivants que j'ai trouvés ne semblent pas fonctionner:
> select "lastUpdate" from myTable; 2019-10-07 10:00:00.000000+00
Il y a une façon de faire les choses correctement, et c'est en spécifiant le fuseau horaire actuel: p >
// my.entity.ts @UpdateDateColumn({type: 'timestamp', name: 'lastUpdate', default: () => 'LOCALTIMESTAMP' }) lastUpdate: Date;
Cependant, comme je l'ai dit, je ne veux pas coder en dur (car d'autres bases de données fonctionnent sur d'autres TZ) et Postgres sait que c'est son propre fuseau horaire.
Y a-t-il une autre syntaxe pour faire cela correctement?
3 Réponses :
Tous les horodatages dans Postgres sont stockés en UTC quelle que soit la configuration du serveur. Ceci est important à réaliser, contrairement aux autres bases de données, il n'interprète pas votre entrée comme étant dans son fuseau horaire local. Cependant, il le présentera dans son fuseau horaire.
horodatage
stocke juste l'heure sans fuseau horaire. horodatage
stocke UTC plus un fuseau horaire.
Démontrer ces derniers ensemble sur un serveur Postgres avec son fuseau horaire défini sur UTC ...
=> select timetz at time zone 'CEST' from demo; timezone --------------------- 2019-10-07 12:00:00
Merci, utiliser timestamptz est en effet la solution simple!
sélectionnez created_at au fuseau horaire 'utc' au fuseau horaire 'america / los_angeles' des utilisateurs;
sélectionnez created_at au fuseau horaire 'utc' au fuseau horaire 'pst' des utilisateurs;
sélectionnez * parmi pg_timezone_names;
sélectionnez ts_tz AT TIME ZONE 'UTC' dans le test;
Vous devriez peut-être essayer de travailler uniquement avec le type
timestamptz
et parfois pas avec le typetimestamp
. Essayez de définir la valeur par défaut surmaintenant ()
. De quel type est votre colonne?Quoi qu'il en soit,
sélectionnez «2019-10-07 10: 00: 00.000000 + 00» au fuseau horaire «CEST»;
fonctionne très bien pour moi. (Sortie:2019-10-07 12: 00:00
)Si vous ne connaissez pas les types et l'opérateur
AT TIME ZONE
, peut-être que la documentation pourrait vous aider: postgresql.org/docs/current/...Puisque
"lastUpdate"
et("lastUpdate" au fuseau horaire 'CEST')
ont tous deux un fuseau horaire dans votre exemple donné, je suppose qu'il y a quelque chose qui ne va pas avec cela.