检查日期是否在两个不包含年份的日期之间

问题描述 投票:0回答:3

我有一个格式为 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")
python datetime
3个回答
0
投票

我想最简单的方法是使用月份和日期日期类属性

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

0
投票

有很多选项可以从日期获取一年中的第几天。使用带有关键字

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
的值。


0
投票

...检查输入的日期是否介于 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)
    大。

© www.soinside.com 2019 - 2024. All rights reserved.