Travailler avec des datetime en python se révèle souvent être un
cauchemar.
Passe encore si votre application/site reste locale. Seulement, si vous
avez le malheur de l'internationaliser, vous risquez de vite devenir
chauve.
Mais voilà, votre meilleur ami est un scientifique un peu timbré qui
s'amuse à faire tomber la foudre sur les horloges. 88 mph et 1.21
Gigawatts plus tard et
le voilà les maître du voyage dans le temps. Sa dernière lubie ?
Python-Delorean
Cette bibliothèque vous permet de convertir des datetime d'une timezone
à un autre comme si de rien n'était. Un petit exemple ?
On va commencez par l'installer:
$ pip install delorean...
Voilà, on y va !
In [1]: from delorean import Delorean
In [2]: d = Delorean() # par default, cela crée une datetime UTC
In [3]: d.timezone()
Out[3]:
In [4]: d.shift("Europe/Paris") # j'habite en France ? Pas de problème
Out[4]: Delorean(datetime=2014-09-16 13:38:04.689447+02:00, timezone=Europe/Paris)
Vous pouvez bien sûr créer votre datetime directement dans la timezone que vous voulez :
In [1]: Delorean(timezone="Europe/Paris")
Out[1]: Delorean(datetime=2014-09-16 13:40:05.065344+02:00, timezone=Europe/Paris)
Vous avez déjà votre datetime à l'heure locale, mais elle n'a pas de timezone ?
In [1]: from datetime import datetime
In [2]: dt = datetime.now()
In [3]: Delorean(datetime=dt, timezone="Europe/Paris")
Out[3]: Delorean(datetime=2014-09-16 13:55:45.128340+02:00, timezone=Europe/Paris)
In [4]: dt = datetime.utcnow() # on recommence avec UTC
In [5]: Delorean(datetime=dt, timezone="UTC").shift("Europe/Paris")
Out[5]: Delorean(datetime=2014-09-16 13:57:00.001028+02:00, timezone=Europe/Paris)
Vous travaillez avec une DB qui stocke les datetime en timestamp ?
In [1]: tp = 1410867753.797579 # ... ma timestamp en DB
In [2]: from delorean import epoch
In [3]: epoch(tp) # convertit un timespamp en datetime UTC
Out[3]: Delorean(datetime=2014-09-16 11:42:33.797579+00:00, timezone=UTC)
In [4]: epoch(tp).shift("Europe/London") # on convertit et on shift à Londre
Out[4]: Delorean(datetime=2014-09-16 12:42:33.797579+01:00, timezone=Europe/London)
Bon, c'est bien tout ça, mais si moi tout ce que je veux, c'est revenir il y a 3 jours
à la même heure ? Pas de souci
In [1]: d = Delorean(timezone="Europe/Paris")
In [2]: d.last_day(3) # d.last_day() nous transporterai hier
Out[2]: Delorean(datetime=2014-09-13 13:59:15.854948+02:00, timezone=Europe/Paris)
Vous pouvez faire pareille pour avec les semaines, mois, années,
secondes, minutes et heures : (last|next)_
où pas
serait day, week,
month, year, second, minute, hour.
La doc est bien faites et
je vous laisse aller y faire un tour.
Si avec ça vous utilisez encore des datetime non localisées...