La fonction isoformat du module datetime en python renvoie un décalage incorrect
Donc j'ai -
timezone = pytz.timezone('Asia/Kolkata')
one_time_stamp = '2017-06-01 05:30:00'
zoned_time_stamp = datetime.datetime.strptime(one_time_stamp, '%Y-%m-%d %H:%M:%S')
#This outputs 2017-06-01 05:30:00 which is fine.
print(zoned_time_stamp)
#notice timezone added
non_iso_zoned_ts = zoned_time_stamp.replace(microsecond=0, tzinfo=timezone)
# This outputs 2017-06-01 05:30:00 which is fine.
print(zoned_time_stamp)
iso_date = non_iso_zoned_ts.isoformat()
#This outputs 2017-06-01T05:30:00+05:53 which is incorrect. Ideally it should be 2017-06-01T05:30:00+05:30
print(iso_date)
Maintenant, je me demande pourquoi isoformat ajoute un décalage de 05:53 alors que le fuseau horaire Asia / Kolkata est +05: 30. réf -https://www.zeitverschiebung.net/en/timezone/asia--kolkata
Réponses
Il est presque toujours faux de simplement virer une instance pytz pour le tzinfo lors de la création d'un datetime. La méthode correcte pour convertir un datetime naïf en une instance sensible au fuseau horaire à l'aide de pytz est d'utiliser la méthode localize de la zone:
zone.localize(dt)
Sortie pour votre cas:
>>> print(timezone.localize(zoned_time_stamp))
2017-06-01 05:30:00+05:30
Il est assez clairement documenté que le passage d'une instance pytz dans tzinfo n'est pas un moyen pris en charge de créer un datetime localisé. Cependant, c'est aussi une erreur si courante dans le code Python - supposons que de nombreux utilisateurs ne lisent pas la documentation!
Pour comprendre pourquoi l'approche incorrecte a montré ce qu'elle a fait ( +05:53décalage étrange ), reportez-vous à pytz: The Fastest Footgun in the West de Paul Ganssle.