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

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

关键逻辑说明:

  1. 解析日期后,根据输入的分隔符生成对应的标准日期格式模板,对比输入与格式化后的结果,排除parse过度推断的情况。
  2. 对无分隔符的纯数字日期,限制长度为6(DDMMYY)或8(YYYYMMDD),且必须为纯数字。
  3. 兼容两位年和四位年的匹配场景,避免合法日期被误判。

内容的提问来源于stack exchange,提问作者Saurabh Deshmukh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:29:54