Python datetime日期相等比较失败 30天预警CAUTION分支不触发问题
问题产生原因
- 时间精度不匹配:
datetime.today()返回的是包含当前时、分、秒、微秒的精确时间点,而通过strptime解析用户输入的mm/dd/yy格式日期时,生成的datetime对象默认是对应日期的00:00:00(零点零分零秒)。代码中判断matexpir == d3时,d3是当前精确时间加30天的时间点,和用户输入日期的零点时间几乎不可能完全相等,因此永远无法命中CAUTION分支。 - 判断逻辑错误:CAUTION的业务逻辑本应是「物料在未来30天内即将到期」,但写的等于判断仅会在到期时间和「当前时刻往后推30天的精确时间点」完全重合时才触发,哪怕时间差1微秒都不会命中,完全不符合实际使用需求。
- 分支覆盖不全:除了上述两个场景外,所有「到期日距离当前超过30天」的正常物料,都会走到else分支返回
Null,这也是测试时频繁返回Null的原因。
修复方案
- 统一比较精度:所有时间比较统一使用仅包含年月日的日期对象,去掉时分秒、微秒的精度干扰,调用
.date()方法即可从datetime对象中提取纯日期。 - 修正区间判断逻辑:将CAUTION的触发条件从「等于30天后的精确时间」改为「到期日晚于今天、且早于等于30天后的日期」,覆盖所有30天内即将到期的场景。
- 补全分支逻辑:距离到期日超过30天的物料属于正常状态,可将原返回的
Null替换为更合理的状态值。
修复后的可运行代码如下:
from datetime import datetime, timedelta matexp = input("What's the material expiration date (mm/dd/yy): ") # 解析输入日期,提取纯年月日部分 matexpir = datetime.strptime(matexp, "%m/%d/%y").date() # 获取当前纯日期(无时分秒) d1 = datetime.today().date() d2 = timedelta(days=30) d3 = d1 + d2 if d1 < matexpir <= d3: matstat = "CAUTION" elif matexpir <= d1: matstat = "EXPIRED" else: matstat = "NORMAL"
内容的提问来源于stack exchange,提问作者Manolex
相关产品推荐
相关产品推荐

