在Python中根据日期范围检查日期

在Python中根据日期范围检查日期,python,datetime,date,time,boolean,Python,Datetime,Date,Time,Boolean,我有一个日期变量:2011-01-15,如果所说的日期是从今天开始的3天内,我想返回一个布尔值。我不太确定如何在Python中构造它。我只处理日期,而不是日期时间 我的工作示例是“宽限期”。一个用户登录到我的网站,如果宽限期在今天起的3天内,则该用户的其他脚本等将被忽略 我知道你可以在Python的日期模块中做一些奇特/复杂的事情,但我不知道该去哪里找。减去两个date对象会得到一个timedelta对象,你可以将其与其他timedelta对象进行比较 例如: >>> from

我有一个日期变量:
2011-01-15
,如果所说的日期是从今天开始的3天内,我想返回一个布尔值。我不太确定如何在Python中构造它。我只处理日期,而不是日期时间

我的工作示例是“宽限期”。一个用户登录到我的网站,如果宽限期在今天起的3天内,则该用户的其他脚本等将被忽略


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

减去两个
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
>>从日期时间导入日期,时间增量
>>>日期(2011年1月15日)-日期。今天()
datetime.timedelta(1)
>>>日期(2011年1月15日)-日期。今天()
真的
>>>日期(2011年1月18日)-日期。今天()
假的

至于“去哪里看”:这个官员非常出色。

在Python中检查一个范围,您可以使用
a>导入日期时间
>>>今天=datetime.date.today()
>>>边距=datetime.timedelta(天数=3)

>>>今天,其他人已经给出了充分的答案,因此无需对这个答案进行投票。
(使用马克·拜尔斯的技巧;+1)

将日期时间导入为dt
从今天开始的天数内(日期,天数=7)定义:
'''
如果日期介于今天和“num_days”之间,则返回True
否则返回False
>>>今天=日期今天()
>>>从今天开始的天内(今天-dt.timedelta(days=1),num\u days=3)
假的
>>>自今日起的日内(dt.date.today(),num_days=3)
真的
>>>从今天开始的天内(今天+dt.timedelta(天=1),天数=3)
真的
>>>从今天开始的天内(今天+dt.timedelta(天=2),天数=3)
真的
>>>从今天开始的天内(今天+dt.timedelta(天=3),num天=3)
真的
>>>从今天开始的天内(今天+dt.timedelta(天=4),天数=3)
假的
'''
下限=dt.date.today()
上限=下限+dt.timedelta(天数=天数)

如果下限面向对象解决方案

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
导入日期时间
类日期时间范围:
定义初始化(self、dt1、dt2):
自.\u dt1=dt1
自.\u dt2=dt2
定义包含(自身,dt):
返回self.\u dt1
我在Python 3.1.3中尝试了这一点,在1月份使用01而1月份使用1时,得到了一个“SyntaxError:invalid token”。还是给你#1虽然…:)哦,对不起。Python2会将其解释为八进制,但他们在Python3中放弃了这种语法,因为它令人困惑。我总是用八进制写日期,你说呢我刚开始学习Python,所以我不知道自己在做什么。欢迎四面八方!这就是为什么我每天都来这里的原因。这一点是给马克·拜尔斯的。我同意,更具可读性,但对托马斯的回答同样有效。谢谢你们两位。我把这两种方法都添加到了我的日记中。很有道理。我也喜欢这个。我喜欢对lower和upper的支持,因为我可能不想在今天之前数数。用doctest完成!;)我喜欢您的解决方案,但我认为范围应该是包容性的,因此使用lessorequal:
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()
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