17370845950

如何用Python正确比较12小时制下的当前时间与截止时间

本文教你用标准库`datetime.strptime()`精准解析并比较am/pm格式的时间,避免手动转换时因12点(如12:3

7 am)引发的逻辑错误,提升代码健壮性与可读性。

在处理12小时制时间(如 12:37 AM、9:00 AM)的比较任务时,手动转换小时值极易出错——尤其是对 12 AM(对应0时)和 12 PM(对应12时)的特殊处理。你提供的代码中多次修改 due_hour(如 due_hour -= 11),不仅逻辑混乱,还导致 12:37 AM 被错误映射为 1 AM,从而在 current_hour == 1 与 due_hour == 9 比较时跳过分钟判断,直接输出 "False",违背预期。

推荐使用 Python 内置的 datetime.strptime() 方法,它专为解析带格式的时间字符串设计,能自动、准确地将 12:37 AM → 00:37、12:00 PM → 12:00、1:15 PM → 13:15 等全部情况标准化为24小时制的 datetime 对象,后续只需直接比较大小即可。

✅ 正确实现示例:

import datetime as dt

# 假设输入变量如下(示例值:当前 12:37 AM,截止 9:00 AM)
current_hour = 12
current_minute = 37
current_section = "AM"

due_hour = 9
due_minute = 0
due_section = "AM"

# 构造标准时间字符串并解析(注意格式符:%I 表示12小时制小时,%M 分钟,%p 表示AM/PM)
try:
    current = dt.datetime.strptime(f"{current_hour}:{current_minute:02d} {current_section}", "%I:%M %p")
    due = dt.datetime.strptime(f"{due_hour}:{due_minute:02d} {due_section}", "%I:%M %p")

    # 直接比较:若当前时间早于截止时间,则仍可提交
    is_eligible = current < due
    print("True" if is_eligible else "False")  # 输出:True ✅

except ValueError as e:
    print("时间格式错误,请检查输入:", e)

? 关键说明:

  • %I:必须使用大写 I(代表12小时制,范围 01–12),不可用 %H(24小时制);
  • :02d:确保分钟始终为两位数(如 0 → "00"),避免 strptime 解析失败;
  • strptime 自动处理所有边界情况:12:00 AM → 00:00,12:00 PM → 12:00,1:00 PM → 13:00;
  • 比较操作符

⚠️ 注意事项:

  • 该方法忽略日期(年月日),仅比较当日时间。若需跨日判断(如截止时间为次日 8:00 AM),需额外处理日期偏移;
  • 输入变量应确保 current_section / due_section 为全大写 "AM" 或 "PM"(strptime 对大小写敏感);
  • 建议添加 try-except 捕获格式异常,增强程序鲁棒性。

总结:与其在手动进位、减法和条件分支中反复调试(尤其易错的12点逻辑),不如交由成熟的标准库完成解析。一行 strptime 调用,即可让时间比较变得简洁、可靠、可维护。