2011-01-14 3 views
30

У меня есть переменная date: 2011-01-15, и я хотел бы получить логическую информацию, если указанная дата находится в пределах 3 дней с СЕГОДНЯ. Я не совсем уверен, как это сделать в Python. Я занимаюсь только датой, а не датой.Дата проверки по дате в Python

Мой рабочий пример - «льготный период». Пользователь регистрируется на моем сайте, и если льготный период находится в пределах 3 дней с сегодняшнего дня, для этого пользователя опущены дополнительные скрипты и т. Д.

Я знаю, что вы можете сделать некоторые причудливые/сложные вещи в модуле даты Python, но я не уверен, где искать.

ответ

78

В Python, чтобы проверить диапазон, который вы можете использовать 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 Более читабельнее, чем у меня. – Thomas

+0

Пункт, данный Марк Байерс. Я согласен, более читабельны, но в равной степени применимы к ответу Томаса. Спасибо вам обоим. Я добавил оба метода в свой дневник. Делает совершенный смысл. – Flowpoke

+0

Спасибо .. Отлично .. Именно то, что я искал .. !! –

7

Вычитание двух объектов date дает объект timedelta, который вы можете сравнить с другими объектами timedelta.

Например:

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

Как "где искать": официальный documentation отлично.

+0

Я попробовал это в Python 3.1.3 и получить «SyntaxError: недопустимый маркер» при использовании 01 в январе по сравнению с использованием 1 за январь. Все еще даю вам # 1, хотя ... :) – a2j

+0

О, извините. Python 2 будет интерпретировать это как восьмеричное, но они отбросили этот синтаксис в Python 3, потому что это было запутанно. Я всегда пишу свои даты в восьмеричном, не так ли? ;) – Thomas

+0

Я новичок в изучении Python, поэтому не знаю, что делаю. Я приветствую все направление! Вот почему я ежедневно прихожу к SO. – a2j

5

Другие не имеют уже более чем адекватно ответил, поэтому нет необходимости голосовать за этот ответ.
(Используется техника, показанная Марк Байерсу answer; +1 к нему).

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

Мне это тоже нравится. Мне нравится поддержка нижнего и верхнего, так как я, возможно, не хочу считать за несколько дней до сегодняшнего дня. В комплекте с доктриной! ;) – Flowpoke

0

объектно-ориентированное решение

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 
Смежные вопросы