Python 如何判断目标日期是否落在for循环遍历得到的成对日期区间内
根因定位
- 抛出
TypeError的核心原因:你在比较操作里用了生成器对象本身,没有把生成器遍历后产出的具体日期值拿出来做比对。Python无法对两个generator实例做大小比较,自然触发类型不支持的报错。 - 之前两种判断逻辑完全失效的本质:没有针对
holidays集合中的单个业务条目做逐区间判断,而是直接把遍历流程产生的生成器结果当作“日期区间集合”参与逻辑判断,相当于根本没有拿到实际的日期值做匹配。 - 第二种逻辑失效的额外问题:用
in判断的写法,仅能校验check_in是否刚好等于某个区间的起点或终点,完全没覆盖“日期落在两个端点中间”的场景,逻辑本身就不符合需求。
正确实现流程
- 第一步:统一把所有字符串格式的日期(如
01-04-2021)转换为Python原生的datetime.date类型,通过指定格式%d-%m-%Y解析,避免字符串隐式比较带来的排序错误。 - 第二步:遍历
holidays业务集合时,对每个条目单独提取对应的date_from、date_to日期值做判断,不要直接用生成器参与比较。 - 第三步:日期区间校验直接使用Python原生的链式比较写法
date_from <= check_in <= date_to,不需要拆写多个带and的条件。
避坑的错误写法参考
# 错误写法1:直接把生成器当日期值做大小比较(就是触发你那个TypeError的写法) if (check_in.date() > (hol.date_from.date() for hol in holidays)) and (check_in.date() < (hol.date_to.date() for hol in holidays)): # 两个比较项都是generator对象,不是具体日期,完全无法正常运算 # 错误写法2:用in做包含判断(逻辑本身就不符合需求) if check_in.date() in (hol.date_from.date() for hol in holidays) or check_in.date() in (hol.date_to.date() for hol in holidays): # 这个判断仅能识别check_in刚好等于某段区间的起点/终点的场景,漏掉了所有区间中间的日期
可直接复用的正确代码
from datetime import datetime # 日期格式定义,匹配示例的dd-mm-yyyy格式 DATE_FORMAT = "%d-%m-%Y" # 示例业务对象集合,实际使用时替换为你从业务接口/数据库取到的holidays列表即可 holidays = [ {"date_from": "01-04-2021", "date_to": "05-04-2021"}, {"date_from": "10-04-2021", "date_to": "15-04-2021"}, ] check_in_str = "03-04-2021" # 待校验日期转成date类型 check_in = datetime.strptime(check_in_str, DATE_FORMAT).date() # 逐条目校验 is_date_in_range = False for hol in holidays: # 单独提取当前条目的起止日期并转格式 date_from = datetime.strptime(hol["date_from"], DATE_FORMAT).date() date_to = datetime.strptime(hol["date_to"], DATE_FORMAT).date() # 链式比较判断 if date_from <= check_in <= date_to: is_date_in_range = True # 命中匹配后直接跳出循环,减少无意义遍历 break print(f"校验结果:{is_date_in_range}") # 示例输入输出为True
如果需要更简洁的实现,可以用内置any()方法替代手写循环,逻辑完全一致:
is_date_in_range = any( datetime.strptime(hol["date_from"], DATE_FORMAT).date() <= check_in <= datetime.strptime(hol["date_to"], DATE_FORMAT).date() for hol in holidays )
内容的提问来源于stack exchange,提问作者Syed Arsalan Hussain
相关产品推荐
相关产品推荐

