2011-01-14 76 views
30

我有一个日期变量:2011-01-15,如果日期距离TODAY之后的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 
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尝试这样做,得到一个“语法错误:无效令牌”使用01时一月与使用1月份。 仍然给你#1虽然... :) – a2j 2011-01-14 20:46:43

+0

哦,对不起。 Python 2会将其解释为八进制,但是他们在Python 3中放弃了这种语法,因为它很混乱。我总是用八进制写日期,不是吗? ;) – Thomas 2011-01-14 20:47:42

+0

我是学习Python的新手,所以我不知道自己在做什么。我欢迎所有的方向!因此,我为什么每天都来这里。 – a2j 2011-01-14 20:49:22

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