web-dev-qa-db-fra.com

pytz - Conversion de l'heure UTC et du fuseau horaire en heure locale

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é?

22
Tzach

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_timedatetime 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é.

35
Tzach

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)
5
xbello

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())
2
paolov

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)
1
N Randhawa

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)

1
user8808265

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.

0
Alex Awaikin