Dans PostgreSQL, vous pouvez utiliser le timezone()
fonction pour convertir un horodatage vers un autre fuseau horaire.
Syntaxe
La syntaxe ressemble à ceci :
timezone(zone, timestamp)
Où zone
est le fuseau horaire dont vous voulez le timestamp
argument à convertir.
Le résultat que vous obtiendrez dépendra du fait que la valeur d'horodatage d'origine inclut ou non un fuseau horaire (et quelle est cette valeur).
Exemple 1 - Lorsque l'horodatage d'origine inclut le fuseau horaire
Voici ce qui se passe lorsque l'horodatage d'origine inclut le fuseau horaire.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');
Résultat :
2020-10-25 04:00:00
Lorsque l'horodatage d'origine inclut le fuseau horaire, le timezone()
La fonction décale la valeur d'horodatage d'origine vers le fuseau horaire spécifié et renvoie la valeur sans fuseau horaire.
Voici ce qui se passe si je change le fuseau horaire de l'horodatage d'entrée.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');
Résultat :
2020-10-25 03:00:00
L'horodatage résultant est décalé en fonction du fuseau horaire d'entrée.
Et si vous spécifiez timestamp with time zone
, mais l'horodatage d'origine n'inclut pas réellement de fuseau horaire, la valeur d'horodatage d'origine est décalée vers le fuseau horaire local.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');
Résultat :
2020-10-24 18:00:00
Dans ce cas, l'horodatage résultant a été reculé de six heures. Cela signifie que mon fuseau horaire local a six heures d'avance sur Indian/Maurice.
Nous pouvons voir le décalage de fuseau horaire qui a été utilisé en sélectionnant directement la valeur d'entrée.
SELECT timestamp with time zone '2020-10-25 00:00:00';
Résultat :
2020-10-25 00:00:00+10
Exemple 2 - Lorsque l'horodatage d'origine N'INCLUT PAS le fuseau horaire
Voici ce qui se passe lorsque l'horodatage d'origine n'est pas inclure un fuseau horaire.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');
Résultat :
2020-10-25 06:00:00+10
Lorsque l'horodatage d'origine n'inclut pas de fuseau horaire, le résultat est affiché en utilisant le TimeZone
actuel réglage et le décalage du fuseau horaire est ajouté.
Cela s'applique à chaque fois que vous spécifiez timestamp without time zone
, même si l'horodatage contient en fait un décalage de fuseau horaire.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');
Résultat :
2020-10-25 06:00:00+10
Il faut s'y attendre, car si je sélectionne uniquement le timestamp without time zone
valeur, voici ce que j'obtiens :
SELECT timestamp without time zone '2020-10-25 00:00:00+12';
Résultat :
2020-10-25 00:00:00
Exemple 3 – horodatage local
Utilisons le localtimestamp
fonction pour exécuter une comparaison entre l'horodatage actuel dans mon propre fuseau horaire et l'horodatage résultant après l'utilisation de timezone()
fonction pour le convertir dans un fuseau horaire différent.
\x
SELECT
localtimestamp,
timezone('Indian/Mauritius', localtimestamp);
Résultat :
localtimestamp | 2020-07-08 15:42:04.965221 timezone | 2020-07-08 21:42:04.965221+10
Le localtimestamp
la fonction renvoie un horodatage type de données, qui vient avec un "sans fuseau horaire" implicite. En d'autres termes, horodatage et horodatage sans fuseau horaire sont la même chose.
Comme démontré précédemment, lorsqu'aucun fuseau horaire n'est spécifié dans l'horodatage d'origine, le TimeZone
actuel paramètre est utilisé et ajouté au résultat. Et c'est donc ce que nous obtenons en utilisant localtimestamp
.
Au fait, dans cet exemple, j'ai utilisé \x
pour afficher le résultat en utilisant l'affichage étendu/la sortie verticale, juste pour le rendre plus facile à lire.
Exemple 4 – horodatage_actuel
Utilisons maintenant le current_timestamp
fonction au lieu de localtimestamp
.
SELECT
current_timestamp,
timezone('Indian/Mauritius', current_timestamp);
Résultat (en utilisant la sortie verticale) :
current_timestamp | 2020-07-08 15:42:04.335669+10 timezone | 2020-07-08 09:42:04.335669
Cette fois, le décalage du fuseau horaire a été ajouté à l'horodatage d'origine, et le timezone()
le résultat ne l'inclut plus.
Nous obtenons ce résultat car le current_timestamp
la fonction renvoie un horodatage avec fuseau horaire type de données.
Exemple 5 - Utilisation des valeurs de temps
Le timezone()
la fonction fonctionne aussi avec time
valeurs (time with time zone
et time without time zone
).
Cependant, lorsque vous l'utilisez à time with time zone
valeurs, le décalage horaire est ajouté au résultat.
SELECT
timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
timezone('Indian/Mauritius', time with time zone '00:00:00');
Résultat (en utilisant la sortie verticale) :
timezone | 04:00:00+04 timezone | 03:00:00+04 timezone | 18:00:00+04
Et pour être complet, voici ces mêmes valeurs en utilisant une time without time zone
type de données.
SELECT
timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
timezone('Indian/Mauritius', time without time zone '00:00:00');
Résultat (en utilisant la sortie verticale) :
timezone | 18:00:00+04 timezone | 18:00:00+04 timezone | 18:00:00+04
Vérifier le fuseau horaire local
Si vous souhaitez vérifier votre propre fuseau horaire local, exécutez SHOW TIMEZONE
.
Voici ce que j'obtiens lorsque j'exécute cette commande.
SHOW TIMEZONE;
Résultat :
Australia/Brisbane
Vérifier le décalage horaire
Armé des connaissances ci-dessus, je peux maintenant vérifier les deux décalages de fuseau horaire en interrogeant le pg_timezone_names
vue.
SELECT *
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';
Résultat (en utilisant la sortie verticale) :
name | abbrev | utc_offset | is_dst --------------------+--------+------------+-------- Indian/Mauritius | +04 | 04:00:00 | f Australia/Brisbane | AEST | 10:00:00 | f
Voir Renvoyer une liste des fuseaux horaires pris en charge par PostgreSQL pour plus d'options et d'exemples de renvoi du fuseau horaire dans PostgreSQL.