2011-01-14 19 views
30

Tengo una variable de fecha: 2011-01-15 y me gustaría obtener un booleano si dicha fecha se encuentra dentro de los 3 días a partir de HOY. No estoy seguro de cómo construir esto en Python. Solo trato con la fecha, no con la fecha.Fecha de comprobación frente al intervalo de fechas en Python

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 dentro de los 3 días posteriores a hoy, se omiten los scripts adicionales, etc. para ese usuario.

Sé que puede hacer algunas cosas sofisticadas o complejas en los módulos de fecha de Python, pero no estoy seguro de dónde buscarlas.

Respuesta

78

En Python para comprobar un rango que puede utilizar a <= x <= b:

>>> import datetime 
>>> today = datetime.date.today() 
>>> margin = datetime.timedelta(days = 3) 

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

+1 Mucho más legible que el mío. – Thomas

+0

Punto dado a Mark Byers. Estoy de acuerdo, más legible pero igualmente válido para la respuesta de Thomas. Gracias a los dos. Agregué ambos métodos a mi Diario. Tiene mucho sentido. – Flowpoke

+0

Gracias ... Perfecto ... ¡Exactamente lo que estaba buscando ...! –

7

Restar dos objetos date le ofrece 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 buscar": el funcionario documentation es excelente.

+0

He intentado esto en Python 3.1.3 y conseguir un "SyntaxError: token válido" cuando se usa 01 para enero vs usando 1 para enero. Aún te da el n. ° 1 ... :) – a2j

+0

Oh, lo siento. Python 2 lo interpretará como octal, pero eliminaron esta sintaxis en Python 3 porque era confuso. Siempre escribo mis fechas en octal, ¿verdad? ;) – Thomas

+0

Soy nuevo en el aprendizaje de Python, así que no sé lo que hago. ¡Doy la bienvenida a todas las direcciones! Entonces, ¿por qué vengo a SO todos los días? – a2j

5

Otros tienen ya más de respuesta adecuada, por lo que no hay necesidad de votar sobre esta respuesta.
(Utiliza la técnica que se muestra en Mark Byers 'answer; +1 a é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() 
+0

Me gusta esto también. Me gusta el soporte para inferior y superior, ya que es posible que no quiera contar unos días antes de hoy. ¡Completa con doctest! ;) – Flowpoke

0

objeto orientado a la solución

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