Python: comment convertir datetime/timestamp d'un fuseau horaire à un autre?
plus précisément, étant donné le fuseau horaire de mon serveur (perspective de l'heure du système) et une entrée de fuseau horaire, Comment puis-je calculer l'heure du système comme si elle était dans ce nouveau fuseau horaire (indépendamment de l'heure d'été, etc.)?
import datetime
current_time = datetime.datetime.now() #system time
server_timezone = "US/Eastern"
new_timezone = "US/Pacific"
current_time_in_new_timezone = ???
2 réponses
si vous connaissez votre fuseau horaire d'origine et le nouveau fuseau horaire dans lequel vous souhaitez le convertir, utilisez d'abord pytz.localize
pour gérer toute localisation (par exemple pour l'heure d'été, etc), puis utilisez pytz.timezone
pour créer des objets timezone, et enfin utilisez datetime.astimezone(timezone)
pour un calcul facile. Par exemple:
import datetime
import pytz # new import
my_timestamp = datetime.datetime.now() # some timestamp
old_timezone = pytz.timezone("US/Eastern")
new_timezone = pytz.timezone("US/Pacific")
# returns datetime in the new timezone
my_timestamp_in_new_timezone = old_timezone.localize(my_timestamp).astimezone(new_timezone)
Et bien sûr, si tout ce que vous voulez, c'est l'heure d'un fuseau horaire spécifique, vous pouvez passer ce fuseau horaire directement dans datetime.maintenant() pour obtenir le timestamp. Comme ceci:
datetime.datetime.now(new_timezone)
maintenant, avec tout ce qui est dit, je recommande fortement de stocker tous vos horodateurs dans UTC comme une norme de système, et d'éviter l'ensemble du problème DST. Pour le contexte, voir: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove /
et pour savoir combien il est difficile de traiter les calculs de temps en général: http://yourcalendricalfallacyis.com
comment convertissez-vous datetime/timestamp d'un fuseau horaire à un autre fuseau horaire?
il y a deux étapes:
-
créer des objets datetime conscients à partir de l'heure du système et du fuseau horaire par exemple, pour obtenir l'heure du système dans le fuseau horaire donné:
#!/usr/bin/env python from datetime import datetime import pytz server_timezone = pytz.timezone("US/Eastern") server_time = datetime.now(server_timezone) # you could pass *tz* directly
Note:
datetime.now(server_timezone)
fonctionne même pendant les périodes ambiguës par exemple, pendant les transitions DST alors queserver_timezone.localize(datetime.now())
peut échouer (50% de chance).si vous êtes sûr que votre temps d'entrée existe dans le fuseau horaire du serveur et qu'il est unique, vous pouvez passer
is_dst=None
pour affirmer que:server_time = server_timezone.localize(naive_time, is_dst=None)
il soulève une exception pour les temps invalides.
S'il est acceptable d'ignorer jusqu'à par jour erreur (Bien que généralement une erreur due à DST est d'environ une heure ) alors vous pouvez laisser tomberis_dst
paramètre:server_time = server_timezone.normalize(server_timezone.localize(naive_time))
.normalize()
est appelé pour ajuster les heures non-existantes (heure locale dans l'intervalle, pendant les transitions "spring forward"). Si les règles du fuseau horaire n'ont pas changé, votre serveur ne devrait pas générer de temps non-existant. Voir " puis-je toujours définir is_dst=True?" -
Convertir un courant datetime objet de la cible fuseau horaire
tz
:tz = pytz.timezone("US/Pacific") server_time_in_new_timezone = server_time.astimezone(tz)