Проверка даты по диапазону дат в Python - PullRequest
43 голосов
/ 14 января 2011

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

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

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

Ответы [ 4 ]

103 голосов
/ 14 января 2011

В 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
8 голосов
/ 14 января 2011

Вычитание двух 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

Относительно "где"смотреть ": официальная документация отлично.

5 голосов
/ 15 января 2011

Другие уже более чем адекватно ответили, поэтому нет необходимости голосовать за этот ответ.
(Используется техника, показанная в ответе Марка Байерса ; +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()
3 голосов
/ 24 февраля 2018

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

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