17370845950

判断作业是否仍在提交截止时间前:Python 时间比较的正确方法

本文教你如何准确比较 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}")

? 关键说明

  • 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 新手也应掌握的标准实践。