我有一个格式为 yyyy-mm-dd 的日期时间日期,我想检查输入的日期是否介于 5 月 15 日和 5 月 25 日之间,而不包含任何年份值。
tripDate_str = str(input("Please enter the trip start date in the following format: YYYY-MM-DD "))
import datetime
tripDate = datetime.datetime.strptime(tripDate_str, "%Y-%m-%d")
我想最简单的方法是使用月份和日期日期类属性
import datetime
tripDate = datetime.datetime.strptime('2022-05-15', "%Y-%m-%d")
start = datetime.datetime.strptime('2022-05-10', "%Y-%m-%d")
end = datetime.datetime.strptime('2022-05-20', "%Y-%m-%d")
if tripDate.month >= start.month and tripDate.month <= end.month and tripDate.day >= start.day and tripDate.day <= end.day:
print('Date in range')
else:
print('Date not in range')
有很多选项可以从日期获取一年中的第几天。使用带有关键字
python day of year
的搜索引擎来查找哪个或只需查看 here at stackoverflow(“在 Python 中将年/月/日转换为一年中的某一天”)。下面的代码用于此目的dateObject.timetuple().tm_yday
:
tripDate_str = str(input("Please enter the trip start date in the following format: YYYY-MM-DD "))
# tripDate_str = "2022-05-18"
## Finding day of year
from datetime import date
tripDate = date(*map(int, tripDate_str.split('-')))
tripDate_dayOfYear = tripDate.timetuple().tm_yday
print("Day of year: ", tripDate_dayOfYear, type(tripDate_dayOfYear))
dateRangeBeg_dayOfYear = date(tripDate.year, 5, 15).timetuple().tm_yday
dateRangeEnd_dayOfYear = date(tripDate.year, 5, 25).timetuple().tm_yday
if dateRangeBeg_dayOfYear <= tripDate_dayOfYear <= dateRangeEnd_dayOfYear:
print("tripDate falls into range", dateRangeBeg_dayOfYear, dateRangeEnd_dayOfYear)
else:
print("tripDate is outside range", dateRangeBeg_dayOfYear, dateRangeEnd_dayOfYear)
为了避免闰年问题,
tripDate.year
用于设置 dateRangeBeg_dayOfYear
和 dateRangeEnd_dayOfYear
的值。
...检查输入的日期是否介于 5 月 15 日和 5 月 25 日之间,不包含任何年份值
您知道可以比较元组吗?
当您从日期中“删除”年份时,您会留下一个
(month, day)
元组,可以直接用于像 begin < now < end
这样的比较。
def in_timeframe(begin, end, the_date):
begin_ = begin.month, begin.day
end_ = end.month, end.day
the_date_ = the_date.month, the_date.day
if begin_ > end_:
# `begin` larger than `end` means the timeframe is over the year boundary
return begin_ <= the_date_ <= (12, 31) or (1, 1) <= the_date_ <= end_
else:
return begin_ <= the_date_ <= end_
# define the boundaries of your date-range
# year does not matter: 1972 is the first leapyear after epoch
begin = date(1972, 12, 21)
end = date(1972, 3, 20)
# check if today is still technically winter...
in_timeframe(begin, end, date(2024, 3, 8))
# True
作为
the_date
参数 datetime.datetime
和 datetime.date
是可以接受的。
这根本不关心闰年或日历。它只是处理两个整数的元组。
您当然可以更改函数以将债券定义为元组,而不是使用 1972 作为占位符。
此外,根据需要调整比较以使用
<=
或 <
。
请记住,超过一年的界限是不可能的;代码没有年份的概念;没有什么比
(1, 1)
小或比 (12, 31)
大。