web-dev-qa-db-fra.com

Python Datetime: utilisez strftime () avec une date sensible au fuseau horaire

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?

6
snoob dogg

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.

4
dnswlt

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

2
Slam

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') )

( http://pytz.sourceforge.net/ )

1
Patrick Artner

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
1
Emmanuel