web-dev-qa-db-fra.com

La conversion python datetime en horodatage et retour en UTC utilise toujours le fuseau horaire local

Je travaille avec un code qui me donne des horodatages utc et je veux les convertir en datetimes appropriés. Malheureusement, lorsque je teste des cas simples avec pytz, le datetime dispose de 6 heures supplémentaires (le décalage CST à UTC). Je dois garder les données de fuseau horaire correctes car je calcule également la différence entre les autres fuseaux horaires. Des idées pourquoi et comment convertir un horodatage utc en un datetime utc?

In [1]: import pytz

In [2]: from datetime import datetime

In [3]: import time

In [4]: datetime.fromtimestamp(time.mktime(datetime(7,1,1, tzinfo=pytz.UTC).timetuple()), tz=pytz.UTC)
Out[4]: datetime.datetime(2007, 1, 1, 6, 0, tzinfo=<UTC>)

In [5]: datetime.fromtimestamp(time.mktime(datetime(7,1,1).utctimetuple()), tz=pytz.UTC)
Out[5]: datetime.datetime(2007, 1, 1, 6, 0, tzinfo=<UTC>)

In [6]: datetime.fromtimestamp(time.mktime(datetime(7,1,1).utctimetuple()))
Out[6]: datetime.datetime(2007, 1, 1, 0, 0)
30
aterrel

Hmm j'ai trouvé la réponse ici: Comment spécifier le fuseau horaire (UTC) lors de la conversion en heure Unix? (Python)

In [101]: ts = calendar.timegm(datetime(2010, 7, 1, tzinfo=pytz.utc).timetuple())

In [102]: datetime.fromtimestamp(ts, tz=pytz.utc)
Out[102]: datetime.datetime(2010, 7, 1, 0, 0, tzinfo=<UTC>)
19
aterrel

Pour obtenir un objet datetime naïf qui représente le temps en UTC à partir de l'horodatage "secondes depuis l'époque":

from datetime import datetime

utc_dt = datetime.utcfromtimestamp(ts)

Si vous souhaitez obtenir un objet datetime conscient pour le fuseau horaire UTC:

import pytz

aware_utc_dt = utc_dt.replace(tzinfo=pytz.utc)

Pour le convertir dans un autre fuseau horaire:

tz = pytz.timezone('America/Montreal')
dt = aware_utc_dt.astimezone(tz)

Pour convertir directement l'horodatage en un objet datetime conscient dans le fuseau horaire donné:

dt = datetime.fromtimestamp(ts, tz)
81
jfs

Vous trouveriez-vous dans le fuseau horaire du CST américain ou équivalent?

On dirait qu'il montre quelle heure était en UTC lorsque votre heure locale était à minuit du 1/1/2007.

1
Olaf