[英]Checking date against date range in Python
I have a date variable: 2011-01-15
and I would like to get a boolean back if said date is within 3 days from TODAY. 我有一个日期变量:
2011-01-15
,如果所述日期在今天的3天之内,我想得到一个布尔值。 Im not quite sure how to construct this in Python. 我不太确定如何在Python中构建它。 Im only dealing with date, not datetime.
我只处理日期,而不是日期时间。
My working example is a "grace period". 我的工作范例是“宽限期”。 A user logs into my site and if the grace period is within 3 days of today, additional scripts, etc. are omitted for that user.
用户登录到我的站点,如果宽限期在今天的3天内,则该用户将省略其他脚本等。
I know you can do some fancy/complex things in Python's date module(s) but Im not sure where to look. 我知道你可以在Python的日期模块中做一些奇特/复杂的事情,但我不知道在哪里看。
In Python to check a range you can use a <= x <= b
: 在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
Subtracting two date
objects gives you a timedelta
object, which you can compare to other timedelta
objects. 减去两个
date
对象会为您提供一个timedelta
对象,您可以timedelta
对象与其他timedelta
对象进行比较。
For example: 例如:
>>> 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
As to "where to look": the official documentation is excellent. 关于“在哪里看”:官方文档非常好。
Others have already more than adequately answered, so no need to vote on this answer. 其他人已经得到了足够的回答,因此无需对此答案进行投票。
(Uses technique shown in Mark Byers' answer ; +1 to him). (使用Mark Byers的回答中显示的技巧;给他+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()
Object oriented solution 面向对象解决方案
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.