Quelle est la manière la plus propre et la plus pythonique d'obtenir le rendez-vous de demain? Il doit y avoir un meilleur moyen que d'en ajouter un à la journée, de gérer les jours à la fin du mois, etc.
Quelle est la manière la plus propre et la plus pythonique d'obtenir le rendez-vous de demain? Il doit y avoir un meilleur moyen que d'en ajouter un à la journée, de gérer les jours à la fin du mois, etc.
Réponses:
datetime.date.today() + datetime.timedelta(days=1)
devrait faire l'affaire
timedelta
peut gérer l'ajout de jours, secondes, microsecondes, millisecondes, minutes, heures ou semaines.
>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2009, 10, 1)
>>> today + datetime.timedelta(days=1)
datetime.date(2009, 10, 2)
>>> datetime.date(2009,10,31) + datetime.timedelta(hours=24)
datetime.date(2009, 11, 1)
Comme demandé dans un commentaire, les jours bissextiles ne posent aucun problème:
>>> datetime.date(2004, 2, 28) + datetime.timedelta(days=1)
datetime.date(2004, 2, 29)
>>> datetime.date(2004, 2, 28) + datetime.timedelta(days=2)
datetime.date(2004, 3, 1)
>>> datetime.date(2005, 2, 28) + datetime.timedelta(days=1)
datetime.date(2005, 3, 1)
Pas de gestion des secondes intercalaires tho:
>>> from datetime import datetime, timedelta
>>> dt = datetime(2008,12,31,23,59,59)
>>> str(dt)
'2008-12-31 23:59:59'
>>> # leap second was added at the end of 2008,
>>> # adding one second should create a datetime
>>> # of '2008-12-31 23:59:60'
>>> str(dt+timedelta(0,1))
'2009-01-01 00:00:00'
>>> str(dt+timedelta(0,2))
'2009-01-01 00:00:01'
Zut.
EDIT - @Mark: La documentation dit "oui", mais le code dit "pas tellement":
>>> time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")
(2008, 12, 31, 23, 59, 60, 2, 366, -1)
>>> time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S"))
1230789600.0
>>> time.gmtime(time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")))
(2009, 1, 1, 6, 0, 0, 3, 1, 0)
>>> time.localtime(time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")))
(2009, 1, 1, 0, 0, 0, 3, 1, 0)
Je penserais que gmtime ou localtime prendrait la valeur renvoyée par mktime et me rendrait le tuple d'origine, avec 60 comme nombre de secondes. Et ce test montre que ces secondes intercalaires peuvent tout simplement disparaître ...
>>> a = time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S"))
>>> b = time.mktime(time.strptime("2009-01-01 00:00:00","%Y-%m-%d %H:%M:%S"))
>>> a,b
(1230789600.0, 1230789600.0)
>>> b-a
0.0
Même le time
module de base peut gérer cela:
import time
time.localtime(time.time() + 24*3600)
time.strftime
gère les secondes intercalaires : voir Note 2: docs.python.org/library/time.html#time.strftime et Note 3: docs.python.org/library/datetime.html#strftime-behavior