Python : obtenir l’heure avec le décalage horaire

BookFinder est la machine de Rube Goldberg qui me permet de maintenir mes fiches de lecture sur métro[biblio]dodo. J’ai longtemps utilisé cette ligne de code Python pour ajouter la date de création d’une nouvelle fiche :

datetime.now().strftime("%Y-%m-%dT%H:%M:%S" + "+01:00")

Au lieu de modifier mon script à chaque changement d’heure, je me suis dit que je pourrais ajouter la directive %z du module datetime pour prendre en compte le décalage horaire :

datetime.now().strftime("%Y-%m-%dT%H:%M:%S%z")

Sauf que cette ligne de code ne produit pas le résultat attendu :

1984-01-24T09:08:30

L’absence du fuseau horaire retarde la publication automatisée avec les actions Github et peut causer des problèmes dans certains lecteurs de flux RSS. Une note de la documentation du module datetime cache les explications : « pour un objet naïf, les codes de format %z et %Z sont remplacés par des chaines vides. »

Or les objets datetime et time sont naïfs, c’est-à-dire qu’ils ne comportent pas d’informations liées aux fuseaux horaires. Le module pytz peut les rendre « conscients », ou aware comme dirait Jean-Claude Van Damme, de l’existence des subtilités des fuseaux horaires. Puisque j’utilise déjà le module datetime, je préfère toutefois utiliser sa méthode astimezone() :

datetime.now().astimezone().strftime("%Y-%m-%dT%H:%M:%S%z")

Cette ligne de code produit le résultat attendu :

1984-01-24T09:08:30+0100

S’il existe un module aussi spécialisé que pytz, c’est que le module datetime de la bibliothèque standard de Python manque de raffinement. Le changement d’heure dans un fuseau exotique pourrait avoir des conséquences imprévues, mais comme je n’ai pas l’intention de visiter les iles Chatham