使用datetimerange判断日期区间时报time inversion found错误如何解决
报错原因说明
- 错误含义:
ValueError: time inversion found是datetimerange库的明确校验提示,指传入time_in_range函数的前两个区间参数(起始时间、结束时间)出现了起始时间大于结束时间的倒序情况,该库设计上不会自动对区间参数做排序处理,因此传入倒序参数会触发异常。 - 程序无响应的原因:你使用了无指定类型的裸
except语法,会捕获所有异常类型,包括KeyboardInterrupt(Ctrl+C触发的中断信号)。同时你遇到的倒序参数场景触发了库内部的死循环逻辑,因此程序会一直卡住,直到你按下Ctrl+C触发中断,中断信号被except捕获后进入异常分支,第二次调用函数时才抛出该错误。 - 偶现的原因:此前你从Elasticsearch取到的所有日期数据都满足
start_date <= end_date的顺序,本次出现了反序的日期数据才触发问题,不属于库的bug。
修复方案
方案1:提前排序区间参数(最优)
在调用函数前先对区间参数做顺序统一,从根源避免触发倒序异常,性能和稳定性都优于异常捕获方案:
# 统一处理区间顺序,保证左值小于等于右值 range_start = min(start_date, end_date) range_end = max(start_date, end_date) inRange = time_in_range(range_start, range_end, timestamp)
方案2:明确指定捕获的异常类型
如果需要保留异常捕获逻辑,必须限定捕获的异常范围,避免吞掉中断、内存错误等无关异常:
try: inRange = time_in_range(start_date, end_date, timestamp) except ValueError as e: # 仅在确认是时间倒序错误时交换参数 if "time inversion found" in str(e): inRange = time_in_range(end_date, start_date, timestamp) else: # 其余 ValueError 正常抛出 raise
内容的提问来源于stack exchange,提问作者programmerskitchen
相关产品推荐
相关产品推荐

