2011-01-14 2 views
30

J'ai une variable de date: 2011-01-15 et j'aimerais obtenir un booléen si cette date est dans les 3 jours à compter d'AUJOURD'HUI. Je ne suis pas tout à fait sûr comment construire cela en Python. Im traitant seulement avec la date, pas datetime.Vérification de la date par rapport à la plage de dates en Python

Mon exemple de travail est un "délai de grâce". Un utilisateur se connecte à mon site et si la période 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ù chercher.

Répondre

78

En Python pour vérifier une liste 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 
+3

+1 Beaucoup plus lisible que le mien. – Thomas

+0

Point accordé à Mark Byers. Je suis d'accord, plus lisible mais tout aussi valable pour la réponse de Thomas. Merci à vous deux. J'ai ajouté les deux méthodes à mon journal. Cela a un sens parfait. – Flowpoke

+0

Merci .. Parfait .. Exactement ce que je cherchais .. !! –

7

deux date objets Soustraction 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": le documentation officiel est excellent.

+0

J'ai essayé en Python 3.1.3 et obtenez un "SyntaxError: jeton non valide" lors de l'utilisation 01 pour Janvier par rapport à l'aide de 1 pour Janvier. Toujours vous donner # 1 si ... :) – a2j

+0

Oh, désolé. Python 2 interprétera cela comme octal, mais ils ont abandonné cette syntaxe dans Python 3 parce qu'elle était source de confusion. J'écris toujours mes dates en octal, n'est-ce pas? ;) – Thomas

+0

Je suis novice dans l'apprentissage de Python, donc je ne sais pas ce que je fais. Je souhaite la bienvenue à toutes les directions! Alors pourquoi je viens à SO tous les jours. – a2j

5

D'autres ont déjà plus répondu de manière adéquate, donc pas besoin de voter sur cette réponse.
(Utilise la technique montrée dans le answer de Mark Byers; +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 __name__ == "__main__": 
    import doctest 
    doctest.testmod() 
+0

J'aime ça aussi. J'aime le soutien pour le bas et le haut, car je ne veux pas compter un jour avant aujourd'hui. Complet avec doctest! ;) – Flowpoke

0

objet solution orientée

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