You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为24转12小时制Python转换代码添加时间有效性约束?

24小时制转12小时制并添加完整输入校验的Python实现

之前通过判断字符串是否包含“25”的方式过于局限,只能覆盖单一非法小时值,无法处理其他非法情况(比如26-99的小时、60+的分/秒、非数字输入等)。正确的做法是拆分时间字符串为时分秒,转换为整数后逐一校验数值范围,具体实现如下:

完整代码实现

def convert_24_to_12(time_str):
    # 拆分时间字符串为时分秒部分
    parts = time_str.strip().split(':')
    # 校验格式是否为HH:MM:SS
    if len(parts) != 3:
        raise ValueError("无效的时间格式,请输入HH:MM:SS格式的时间")
    
    try:
        hour = int(parts[0])
        minute = int(parts[1])
        second = int(parts[2])
    except ValueError:
        raise ValueError("时分秒必须为整数")
    
    # 数值范围校验
    if not (0 <= hour <= 24):
        raise ValueError("小时必须在0-24之间")
    if not (0 <= minute <= 59):
        raise ValueError("分钟必须在0-59之间")
    if not (0 <= second <= 59):
        raise ValueError("秒必须在0-59之间")
    
    # 处理12小时制转换逻辑
    if hour == 0 or hour == 24:
        twelve_hour = 12
        period = "AM"
    elif 1 <= hour < 12:
        twelve_hour = hour
        period = "AM"
    elif hour == 12:
        twelve_hour = 12
        period = "PM"
    else:  # 13-23
        twelve_hour = hour - 12
        period = "PM"
    
    # 格式化输出为两位数字的时分秒
    return f"{twelve_hour:02d}:{minute:02d}:{second:02d} {period}"

# 测试示例
if __name__ == "__main__":
    # 合法输入测试
    print(convert_24_to_12("23:59:59"))  # 输出 11:59:59 PM
    print(convert_24_to_12("00:00:00"))  # 输出 12:00:00 AM
    print(convert_24_to_12("12:30:45"))  # 输出 12:30:45 PM
    print(convert_24_to_12("24:00:00"))  # 输出 12:00:00 AM
    
    # 非法输入测试(取消注释可验证)
    # print(convert_24_to_12("25:00:00"))  # 抛出小时范围错误
    # print(convert_24_to_12("12:60:00"))  # 抛出分钟范围错误
    # print(convert_24_to_12("12:30:60"))  # 抛出秒范围错误
    # print(convert_24_to_12("abc:00:00")) # 抛出非整数错误
    # print(convert_24_to_12("1:00:00"))   # 抛出格式错误

关键校验逻辑说明

  1. 格式校验:先确保输入是HH:MM:SS的三段式结构,避免短格式或多段输入。
  2. 类型校验:通过int()转换捕获非数字输入的情况,确保时分秒都是整数。
  3. 数值范围校验:
    • 小时限制在0-24(24代表午夜,等价于00:00:00)
    • 分钟和秒限制在0-59,覆盖所有合法的分秒值
  4. 转换逻辑:处理特殊时间点(如00/24点转12 AM,12点转12 PM),其余时间按规则转换。

为什么之前的方法无效?

  • 仅判断字符串是否包含“25”只能覆盖25:xx:xx这一种非法小时情况,无法处理26:xx:xx、99:xx:xx等其他非法小时。
  • 完全没处理分钟和秒的非法值(如xx:60:xx或xx:xx:60)。
  • 无法应对带前导零的非法输入(如025:00:00,字符串中不包含“25”但实际小时是25)。

这样处理后,所有非法时间输入都会被精准拦截,同时保证转换逻辑的正确性。

内容的提问来源于stack exchange,提问作者The Calebporium

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:01:08