J'ai une datetime
dans le fuseau horaire utc, par exemple:
utc_time = datetime.datetime.utcnow()
Et un objet pytz timezone:
tz = timezone('America/St_Johns')
Quelle est la bonne façon de convertir utc_time
au fuseau horaire donné?
Je crois que j'ai compris:
pytz.utc.localize(utc_time, is_dst=None).astimezone(tz)
Cette ligne convertit d’abord l’objet naïf (indicatif de fuseau horaire) utc_time
datetime
en un objet datetime
contenant un fuseau horaire (UTC). Ensuite, il utilise la fonction astimezone
pour régler l’heure en fonction du fuseau horaire demandé.
Puis-je recommander d'utiliser arrow ? Si j'ai compris la question:
>>> import arrow
>>> utc = arrow.utcnow()
>>> utc
<Arrow [2014-08-12T13:01:28.071624+00:00]>
>>> local = utc.to("America/St_Johns")
>>> local
<Arrow [2014-08-12T10:31:28.071624-02:30]>
Vous pouvez aussi utiliser
tz.fromutc(utc_time)
Je suis d'accord avec la réponse de Tzach. Je voulais juste inclure que le paramètre is_dst n'est pas requis:
pytz.utc.localize(datetime.utcnow()).astimezone(tz)
Ce code convertit l’heure UTC actuelle en une date/heure actuelle sensible au fuseau horaire.
Considérant que le code ci-dessous convertit l’heure UTC actuelle en une date/heure sensible au fuseau horaire qui n’est pas nécessairement actuelle Le fuseau horaire est simplement ajouté à la valeur de l'heure UTC.
tz.localize(datetime.utcnow())
Un autre moyen très simple:
Étant donné que la méthode utcnow
renvoie un objet naive , vous devez convertir l’objet naive en un objet aware . En utilisant la méthode replace
, vous pouvez convertir un objet naive en un objet aware . Ensuite, vous pouvez utiliser la méthode astimezone
pour créer un nouvel objet datetime dans un fuseau horaire différent.
from datetime import datetime
import pytz
utc_time = datetime.utcnow()
tz = pytz.timezone('America/St_Johns')
utc_time =utc_time.replace(tzinfo=pytz.UTC) #replace method
st_john_time=utc_time.astimezone(tz) #astimezone method
print(st_john_time)
C'est le but exact de fromutc
function:
tz.fromutc(utc_time)
(as_timezone
appelle la fonction fromutc
sous le capot, mais essaie d'abord de convertir en UTC, ce qui n'est pas nécessaire dans votre cas)
Vous pouvez également utiliser l'exemple ci-dessous, je l'utilise pour une tâche similaire
tz = pytz.timezone('America/St_Johns')
time_difference=tz.utcoffset(utc_time).total_seconds() #time difference between UTC and local timezones in 5:30:00 format
utc_time = date + timedelta(0,time_difference)
Cela fonctionne rapidement et vous n'avez pas besoin d'importer de bibliothèques supplémentaires.