我有一個日期變量:2011-01-15
,如果日期距離TODAY之後的3天內,我想返回一個布爾值。我不太清楚如何在Python中構造它。我只處理日期,而不是日期時間。在Python中使用日期範圍檢查日期
我的工作示例是「寬限期」。用戶登錄到我的網站,如果寬限期在今天的3天之內,則該用戶將省略其他腳本等。
我知道你可以在Python的日期模塊中做一些花哨/複雜的事情,但林不知道在哪裏看。
我有一個日期變量:2011-01-15
,如果日期距離TODAY之後的3天內,我想返回一個布爾值。我不太清楚如何在Python中構造它。我只處理日期,而不是日期時間。在Python中使用日期範圍檢查日期
我的工作示例是「寬限期」。用戶登錄到我的網站,如果寬限期在今天的3天之內,則該用戶將省略其他腳本等。
我知道你可以在Python的日期模塊中做一些花哨/複雜的事情,但林不知道在哪裏看。
在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
減去兩個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非常出色。
別人已經比充分回答多,所以沒必要對這個答案進行投票。
(使用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()
面向對象的解決方案
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
我在Python 3.1.3嘗試這樣做,得到一個「語法錯誤:無效令牌」使用01時一月與使用1月份。 仍然給你#1雖然... :) – a2j 2011-01-14 20:46:43
哦,對不起。 Python 2會將其解釋爲八進制,但是他們在Python 3中放棄了這種語法,因爲它很混亂。我總是用八進制寫日期,不是嗎? ;) – Thomas 2011-01-14 20:47:42
我是學習Python的新手,所以我不知道自己在做什麼。我歡迎所有的方向!因此,我爲什麼每天都來這裏。 – a2j 2011-01-14 20:49:22