web-dev-qa-db-fra.com

Vérification de la date par rapport à la plage de dates dans Python

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.

45
Flowpoke

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
108
Mark Byers

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.

8
Thomas

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

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