在Python中检查日期与日期范围

时间:2011-01-14 20:29:30

标签: python datetime date time boolean

我有一个日期变量:2011-01-15如果所述日期在今天3天之内,我想得到一个布尔值。我不太确定如何在Python中构建它。我只处理日期,而不是日期时间。

我的工作范例是“宽限期”。用户登录我的站点,如果宽限期在今天的3天内,则该用户将省略其他脚本等。

我知道你可以在Python的日期模块中做一些奇特/复杂的事情,但我不知道在哪里看。

5 个答案:

答案 0 :(得分:101)

在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

答案 1 :(得分:8)

减去两个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非常出色。

答案 2 :(得分:5)

其他人已经得到了足够的回答,因此无需对此答案进行投票 (使用Mark Byers'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()

答案 3 :(得分:3)

面向对象的解决方案

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

答案 4 :(得分:0)

将经过的时间转换为天,然后对经过的天数应用三元运算

current_dt=datetime.now()
feed_dt = datetime.now()-timedelta(days=3)
from_dt=datetime(year=feed_dt.year,month=feed_dt.month,day=feed_dt.day)
days_elapsed=(current_dt-from_dt).days
print(True if days_elapsed <=3 else False)

输出: 真实