如何为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")) # 抛出格式错误
关键校验逻辑说明
- 格式校验:先确保输入是
HH:MM:SS的三段式结构,避免短格式或多段输入。 - 类型校验:通过
int()转换捕获非数字输入的情况,确保时分秒都是整数。 - 数值范围校验:
- 小时限制在0-24(24代表午夜,等价于00:00:00)
- 分钟和秒限制在0-59,覆盖所有合法的分秒值
- 转换逻辑:处理特殊时间点(如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
相关产品推荐
相关产品推荐

