You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:27:20