Comprobando la fecha contra el rango de fechas en Python

Tengo una variable de fecha: 2011-01-15 y me gustaría obtener un respaldo booleano si dicha fecha es dentro de 3 días a partir de HOY. No estoy muy seguro de cómo construir esto en Python. Solo estoy tratando con fecha, no fecha y hora.

Mi ejemplo de trabajo es un “período de gracia”. Un usuario inicia sesión en mi sitio y, si el período de gracia es de 3 días a partir de hoy, se omiten las secuencias de comandos adicionales, etc. para ese usuario.

Sé que puedes hacer algunas cosas elegantes / complejas en los módulos de fecha de Python, pero no estoy seguro de dónde buscar.

En Python para verificar un rango puede usar a <= x <= b :

 >>> import datetime >>> today = datetime.date.today() >>> margin = datetime.timedelta(days = 3) >>> today - margin <= datetime.date(2011, 1, 15) <= today + margin True 

Restar dos objetos de date le da un objeto timedelta , que puede comparar con otros objetos timedelta .

Por ejemplo:

 >>> 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 

En cuanto a "dónde mirar": la documentación oficial es excelente.

Otros ya han respondido más que adecuadamente, por lo que no es necesario votar sobre esta respuesta.
(Utiliza la técnica mostrada en la respuesta de Mark Byers; +1 para él).

 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() 

Solución orientada a objetos

 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