Python处理DD-YY-MM格式字符串日期时如何正确设置校验条件
Python日期字符串拆分与校验实现
需求
实现逻辑接收用户输入的DD-MM-YYYY格式日期字符串,拆分输出日、月、年字段,同时满足以下校验规则:
- 日取值范围1-31
- 月取值范围1-12
- 年份不小于1900
原代码报错原因
运行触发TypeError: '>' not supported between instances of 'str' and 'int',是因为字符串切片得到的日、月、年字段都是字符串类型,Python不支持直接用比较运算符对比字符串和整数的大小。
原代码额外存在3处逻辑问题:
- 范围判断的逻辑符使用错误:
D>31 and D<1这类条件永远无法成立,一个值不可能同时大于31且小于1,越界判断应该用or连接两个条件 - 年份校验阈值错误:需求要求年份≥1900,原代码写为1990
- 无基础格式校验:没有判断输入长度、分隔符位置是否合规,容易出现切片取值错位
修正实现
不需要修改原始输入的字符串类型,仅需在做数值校验时,把切片得到的子串临时转为整数比较即可,原始输入、用于输出的字段都可以保留字符串类型。
修正后代码:
# 原始输入全程保持字符串类型 FullDate = input("enter todays date(format: DD-MM-YYYY): ") validate_pass = True # 先校验基础格式,避免切片错位 if len(FullDate) != 10 or FullDate[2] != '-' or FullDate[5] != '-': print("invalid input format, please enter as DD-MM-YYYY") validate_pass = False else: # 切片得到字符串类型的日、月、年,用于后续输出 day_str = FullDate[:2] month_str = FullDate[3:5] year_str = FullDate[6:] # 临时转换为整数做数值校验,不改变原字段的字符串类型 try: day = int(day_str) month = int(month_str) year = int(year_str) except ValueError: print("invalid input, date can only contain numbers and '-' separator") validate_pass = False else: # 校验日范围 if day < 1 or day > 31: print("invalid date") validate_pass = False # 校验月范围 if month < 1 or month > 12: print("invalid month") validate_pass = False # 校验年范围 if year < 1900: print("invalid year") validate_pass = False # 所有校验通过后输出字段 if validate_pass: print("the day is", day_str) print("the month is", month_str) print("the year is", year_str)
实现说明
- 原始输入
FullDate始终为字符串类型,符合要求 - 输出用的
day_str/month_str/year_str都是从原字符串直接切片得到的字符串,仅在校验环节临时转整数做数值比较,不会修改原数据类型 - 新增了格式校验、非数字字符校验,避免非法输入导致程序崩溃
- 修正了原代码中逻辑运算符、校验阈值、输出文案的笔误
内容的提问来源于stack exchange,提问作者stactharover
相关产品推荐
相关产品推荐

