
本文教你用标准库`datetime.strptime()`精准解析并比较am/pm格式的时间,避免手动转换时因12点(如12:37 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)? 关键说明:
立即学习“Python免费学习笔记(深入)”;
- %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 调用,即可让时间比较变得简洁、可靠、可维护。










