Vérification de la date par rapport à la plage de dates en Python
J'ai une variable de date: 2011-01-15
et je voudrais récupérer un booléen si cette date est dans les 3 jours à partir d'AUJOURD'hui. Je ne suis pas tout à fait sûr de savoir comment construire cela en Python. Je ne traite que de la date, pas de datetime.
Mon exemple de travail est un "délai 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 fantaisistes / complexes dans le(s) module (s) de date de Python mais je ne sais pas où aller regarder.
4 réponses
En 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" : la documentation officielle est excellente.
D'Autres ont déjà répondu, donc pas besoin de voter sur cette réponse.
(Utilise la technique montrée dans la réponse de Mark Byers; +1 à 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 __name__ == "__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):
if dt > dt1 and dt < dt2:
return True
else:
return False
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