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.

33
demandé sur Flowpoke 2011-01-14 23:29:30

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
86
répondu Mark Byers 2011-01-14 20:35:49

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.

8
répondu Thomas 2011-01-14 20:47:50

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()
5
répondu bernie 2017-05-23 12:34:39

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
0
répondu mdornfe1 2018-02-23 23:37:17