
本文教你如何准确比较 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}")? 关键说明:
立即学习“Python免费学习笔记(深入)”;
- f"{current_minute:02d}" 确保分钟始终为两位数(如 7 → "07"),避免 strptime 解析失败;
- %I 严格匹配 12 小时制(1–12),%p 自动识别 AM/PM 并转换为 24 小时制(12:xx AM → 00:xx,12:xx PM → 12:xx);
- 所有边界情况(如 12:00 AM, 12:01 PM, 1:59 AM)均被标准库正确覆盖,无需额外分支。
⚠️ 不推荐手动转换的原因:
12 小时制到 24 小时制的映射规则是:
- 12:xx AM → 00:xx
- 1–11:xx AM → 01–11:xx
- 12:xx PM → 12:xx
- 1–11:xx PM → 13–23:xx
手动实现易漏掉任一条件,而 strptime 经过充分测试,完全可靠。
✅ 总结:抛弃复杂的手动逻辑,用 datetime.strptime() 解析 + 直接比较,代码更短、更清晰、更鲁棒。这是 Python 新手也应掌握的标准实践。










