PostgreSQL - comment afficher la date dans un autre fuseau horaire?
Mon serveur est dans le centre de Temps. Je tiens à rendre des horodateurs, à l'aide de heure de l'est.
Par exemple, je voudrais rendre 2012-05-29 15:00:00
comme 2012-05-29 16:00:00 EDT
.
Comment puis-je l'atteindre?
to_char('2012-05-29 15:00:00'::timestamptz at time zone 'EST5EDT', 'YYYY-MM-DD HH24:MI:SS TZ')
donne 2012-05-29 16:00:00
(pas de zone).
to_char('2012-05-29 15:00:00'::timestamp at time zone 'EST5EDT', 'YYYY-MM-DD HH24:MI:SS TZ')
donne 2012-05-29 14:00:00 CDT
(faux).
Celui-ci fonctionne, mais c'est tellement ridiculement compliqué, il doit y avoir un moyen plus facile: replace(replace(to_char(('2012-05-29 15:00:00'::timestamptz at time zone 'EST5EDT')::timestamptz, 'YYYY-MM-DD HH24:MI:SS TZ'), 'CST', 'EST'), 'CDT', 'EDT')
- Comment le serveur est censé connaître le fuseau horaire à l'abréviation que vous souhaitez afficher? Il ne connaît que le décalage de fuseau horaire
- Les informations de fuseau horaire n'est pas de la magie noire. Il n'y a pas de raison technique qui rendrait impossible (ou même dur) pour dire que 5/29 est l'heure d'été, Heure de l'est. En fait, PG sait tout -
to_char(x, 'TZ')
différencie de la CST, de la CDT correctement, etat time zone EST5EDT
respecte l'heure d'été ainsi. Le seul bit me manque, c'est élégant, le rendu à l'aide de cette information. - Ici, le problème est dans l'étrange choix de la Postgres devs qui
timestamp with time zone at _zone_
doit convertir les fuseaux horaires, mais de retourtimestamp without time zone
. - Il y a beaucoup de lieux bizarre autour de la conversion de
timestamp
<->timestamptz
et à l'aide deat time zone
, mais il n'y a vraiment aucun moyen intégré pour rendre fuseau horaire différent, commefmt_date(x, 'YYYY-MM-DD HH24:MI:SS TZ', 'EST5EDT')
? - J'ai réfléchi à la même question à un certain moment dans le passé, et aussi loin que je me souvienne, ne pouvait pas trouver un sane solution. Probablement le meilleur que vous pouvez faire est de gérer les fuseaux horaires et de la mise en forme de l'application côté plutôt que dans la base de données, si ce n'est pas vraiment une réponse à votre question.
- Décevant car il n'est "pas possible" est aussi une réponse valable.
Vous devez vous connecter pour publier un commentaire.
La clé est de changer le fuseau horaire local à l'écran souhaité fuseau horaire, pour la durée de l'opération:
Le résultat est:
Noter qu'avec
set [local] timezone
il est nécessaire d'utiliser à temps plein de la zone des noms plutôt que des abréviations (par exemple, CST ne fonctionnerait pas). Regardez dans lapg_timezone_names
vue pour les choix valides.À utiliser cette méthode dans un contexte semblable à celui d'un to_char() l'appel, je crois que cette fonction fait le job:
timezone
. J'ai été en supposant que la valeur par défauttimezone
. Et j'aime laSHOW timezone INTO
.TZ=Australia/Perth date
Lorsque vous traitez avec un timestamp Postgres sait:
fuseau horaire
.timestamp
ettimestamptz
. (Ou, pour être plus précis: UT1.)Lors de l'interprétation d'entrée, Postgres utilise les informations sur la condition de fuseau horaire.
Lors du rendu d'une valeur d'horodatage, Postgres utilise le actuel
timezone
, mais fuseau horaire décalage, abréviation ou nom ne sont utilisés que pour calculer le bon valeur sur entrée. Ils sont pas enregistré. Il est impossible pour extraire cette information plus tard. Plus de détails dans cette liées répondre:Votre "corriger" l'exemple est presque correcte.
TZ
deto_char()
revient " CDT " pour les horodateurs qui tombent dans l'heure d'été à des périodes d'Heure du centre) et 'CST' d'autre. Heure de l'est (EST
/EDT
) passe à l'heure d'été heures à la même local temps - je cite Wikipedia:Les deux zones sont de synchronisation cours de deux heures par an. Bien sûr, cela ne peut jamais affecter un horodatage au
15:00
ou16:00
, seulement autour de02:00
.Entièrement solution correcte - un peu comme ce @Daniel déjà posté, légèrement simplifiée:
Le manuel à propos de
LOCAL
.timestamp
, ce que je cherche est un moyen de rendre unevarchar
avec différents temps le nom de la zone dans un cas général.