J'ai une variable de date: 2011-01-15
et j'aimerais obtenir un retour booléen si cette date est dans les 3 jours à compter d'aujourd'hui. Je ne sais pas trop comment construire cela en Python. Je ne traite que de la date, pas du datetime.
Mon exemple de travail est une "période de grâce". Un utilisateur se connecte à mon site et si le délai de grâce est dans les 3 jours d'aujourd'hui, des scripts supplémentaires, etc. sont omis pour cet utilisateur.
Je sais que vous pouvez faire des choses sophistiquées/complexes dans les modules de date de Python, mais je ne sais pas où chercher.
In Python pour vérifier une plage que vous pouvez utiliser a <= x <= b
:
>>> import datetime
>>> today = datetime.date.today()
>>> margin = datetime.timedelta(days = 3)
>>> today - margin <= datetime.date(2011, 1, 15) <= today + margin
True
La soustraction de deux objets date
vous donne un objet timedelta
, que vous pouvez comparer à d'autres objets timedelta
.
Par exemple:
>>> from datetime import date, timedelta
>>> date(2011, 1, 15) - date.today()
datetime.timedelta(1)
>>> date(2011, 1, 15) - date.today() < timedelta(days = 3)
True
>>> date(2011, 1, 18) - date.today() < timedelta(days = 3)
False
Quant à "où chercher": l'officiel documentation est excellent.
D'autres ont déjà répondu plus qu'adéquatement, il n'est donc pas nécessaire de voter sur cette réponse.
(Utilise la technique indiquée dans Mark Byers réponse ; +1 pour lui).
import datetime as dt
def within_days_from_today(the_date, num_days=7):
'''
return True if date between today and `num_days` from today
return False otherwise
>>> today = dt.date.today()
>>> within_days_from_today(today - dt.timedelta(days=1), num_days=3)
False
>>> within_days_from_today(dt.date.today(), num_days=3)
True
>>> within_days_from_today(today + dt.timedelta(days=1), num_days=3)
True
>>> within_days_from_today(today + dt.timedelta(days=2), num_days=3)
True
>>> within_days_from_today(today + dt.timedelta(days=3), num_days=3)
True
>>> within_days_from_today(today + dt.timedelta(days=4), num_days=3)
False
'''
lower_limit = dt.date.today()
upper_limit = lower_limit + dt.timedelta(days=num_days)
if lower_limit <= the_date <= upper_limit:
return True
else:
return False
if __== "__main__":
import doctest
doctest.testmod()
Solution orientée objet
import datetime
class DatetimeRange:
def __init__(self, dt1, dt2):
self._dt1 = dt1
self._dt2 = dt2
def __contains__(self, dt):
return self._dt1 < dt < self._dt2
dt1 = datetime.datetime.now()
dt2 = dt1 + datetime.timedelta(days = 2)
test_true = dt1 + datetime.timedelta(days = 1)
test_false = dt1 + datetime.timedelta(days = 5)
test_true in DatetimeRange(dt1, dt2) #Returns True
test_false in DatetimeRange(dt1, dt2) #Returns False