Supposons que j'ai la date d
comme ceci:
>>> d
datetime(2009, 4, 19, 21, 12, tzinfo=tzoffset(None, -7200))
Comme vous pouvez le voir, il est "sensible au fuseau horaire", il y a un décalage de 2 heures,
>>> d.utctimetuple()
time.struct_time(tm_year=2009, tm_mon=4, tm_mday=19,
tm_hour=23, tm_min=12, tm_sec=0,
tm_wday=6, tm_yday=109, tm_isdst=0)
Donc, la vraie date UTC est le 19 mars 2009 2: 12:00, non?
Maintenant, je dois formater ma date en chaîne, j'utilise
>>> d.strftime('%Y-%m-%d %H:%M:%S.%f')
'2009-04-19 21:12:00.000000'
Ce qui ne semble pas tenir compte de ce décalage. Comment y remédier?
En plus de ce que @Slam a déjà répondu:
Si vous souhaitez afficher l'heure UTC sans décalage, vous pouvez le faire
from datetime import timezone, datetime, timedelta
d = datetime(2009, 4, 19, 21, 12, tzinfo=timezone(timedelta(hours=-2)))
d.astimezone(timezone.utc).strftime('%Y-%m-%d %H:%M:%S.%f')
Voir datetime.astimezone dans la documentation Python.
La raison en est python formatant réellement votre objet datetime, pas un "UTC à ce moment")
Pour afficher le fuseau horaire dans le formatage, utilisez %z
ou %Z
.
Recherchez strf docs pour plus de détails
Cela convertira votre heure locale en UTC et l'imprimera:
import datetime, pytz
from dateutil.tz.tz import tzoffset
loc = datetime.datetime(2009, 4, 19, 21, 12, tzinfo=tzoffset(None, -7200))
print(loc.astimezone(pytz.utc).strftime('%Y-%m-%d %H:%M:%S.%f') )
Je ne pouvais pas importer de module de fuseau horaire (et je n'avais pas beaucoup de temps pour savoir pourquoi), j'ai donc défini la variable d'environnement TZ qui remplace les informations/etc/localtime
>>> import os
>>> import datetime
>>> print datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
2019-05-17 11:26
>>> os.environ["TZ"] = "UTC"
>>> print datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
2019-05-17 09:26