web-dev-qa-db-fra.com

Le moyen le plus propre et le plus pythonique pour obtenir la date de demain?

Quelle est la façon la plus propre et la plus pythonique d'obtenir la date 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.

91
linkmaster03

datetime.date.today() + datetime.timedelta(days=1) devrait faire l'affaire

187
Kamil Szot

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)
34
Mark Rushakoff

Aucune manipulation de 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: Les documents disent "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 retourné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 juste 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
6
PaulMcG

Même le module de base time peut gérer cela:

import time
time.localtime(time.time() + 24*3600)
5
u0b34a0f6ae