dateutil parser遇非法日期未抛ValueError,如何修正?
解决dateutil.parse过度解析非法日期格式的问题
dateutil.parser.parse的宽松解析逻辑会将类似"13.75"的非标准字符串强行推断为合法日期,导致无法返回预期的错误提示。要保留多格式解析能力同时排除这类非法格式,可以在解析后增加格式匹配验证,确保输入字符串确实符合标准日期格式的结构:
from dateutil.parser import parse import re def convert_to_ddmmyy(date_string): try: # 先解析日期 date = parse(date_string) # 获取输入中的日期分隔符(. / -) sep_match = re.search(r'[./-]', date_string) if sep_match: sep = sep_match.group() # 生成与输入分隔符一致的常见日期格式模板 possible_formats = [ f"%d{sep}%m{sep}%y", f"%d{sep}%m{sep}%Y", f"%m{sep}%d{sep}%y", f"%m{sep}%d{sep}%Y", f"%Y{sep}%m{sep}%d" ] # 检查输入是否与解析后的日期格式化结果匹配 is_valid_format = False for fmt in possible_formats: try: formatted_date = date.strftime(fmt) # 兼容两位年和四位年的匹配(如输入"13.06.23"和格式化后"13.06.2023"视为匹配) if formatted_date == date_string or formatted_date[-2:] == date_string[-2:]: is_valid_format = True break except ValueError: continue if not is_valid_format: return "无效日期格式" else: # 处理无分隔符的纯数字日期,验证长度和是否为纯数字 if len(date_string) not in (6, 8) or not date_string.isdigit(): return "无效日期格式" # 格式验证通过,返回目标格式日期 return date.strftime("%d%m%y") except ValueError: return "无效日期格式" # 测试用例 print(convert_to_ddmmyy("13.75")) # 输出:无效日期格式 print(convert_to_ddmmyy("13/06/2023")) # 输出:130623 print(convert_to_ddmmyy("06-13-23")) # 输出:130623 print(convert_to_ddmmyy("20230613")) # 输出:130623
关键逻辑说明:
- 解析日期后,根据输入的分隔符生成对应的标准日期格式模板,对比输入与格式化后的结果,排除parse过度推断的情况。
- 对无分隔符的纯数字日期,限制长度为6(DDMMYY)或8(YYYYMMDD),且必须为纯数字。
- 兼容两位年和四位年的匹配场景,避免合法日期被误判。
内容的提问来源于stack exchange,提问作者Saurabh Deshmukh
相关产品推荐
相关产品推荐

