本文教你如何准确比较 am/pm 格式的当前时间与截止时间,避免手动转换 12 小时制时常见的逻辑错误(如 12:37 am 与 9:00 am 比较失败),推荐使用 `datetime.strptime()` 自动解析,简洁、健壮、零出错。
在处理 12 小时制时间(带 AM/PM)比较时,手动调整小时值极易出错——尤其是对 12 AM(即 0 点)和 12 PM(即 12 点)的特殊处理。你原始代码中多处 due_hour -= 11 等修正逻辑不仅冗余,而且相互冲突(例如重复修改 due_hour),导致 12:37 AM 被错误转换或比较失效。
✅ 正确做法:交给标准库处理。Python 的 datetime.strptime() 支持 %I(12 小时制小时)、%M(分钟)、%p(AM/PM)格式符,能自动、无歧义地将 "12:37 AM" 解析为 00:37,将 "9:00 AM" 解析为 09:00,无需任何手工加减。
以下是完整、可直接运行的解决方案:
import datetime as dt
# 示例输入(替换为你的真实变量)
current_hour = 12
current_minute = 37
current_section = "AM"
due_hour = 9
due_minute = 0
due_section = "AM"
# 构造时间字符串并解析为 datetime 对象(年月日固定为1900-01-01,仅用于时分秒比较)
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(is_eligible) # 输出: True ✅
except ValueError as e:
print(f"时间格式错误: {e}")? 关键说明:
⚠️ 不推荐手动转换的原因:
12 小时制到 24 小时制的映射规则是:
✅ 总结:抛弃复杂的手动逻辑,用 datetime.strptime() 解析 + 直接比较,代码更短、更清晰、更鲁棒。这是 Python 新手也应掌握的标准实践。