dateutil.parser.parse解析日期按需返回精确日期或月末日期
日期格式转换实现方案
直接用dateutil内置的解析能力,不需要手写正则匹配各种零散格式,核心逻辑是判断解析结果里是否识别到了「日」字段,没识别到就自动取当月最后一天即可。
实现代码
先导入依赖模块:
from dateutil.parser import parser import calendar from datetime import date
封装通用解析函数:
def parse_custom_date(date_str: str) -> date: # 调用内部解析方法,拿到解析值和已识别的字段集合 parsed_res, detected_fields = parser()._parse(date_str, dayfirst=True) year, month = parsed_res.year, parsed_res.month # 未识别到日字段,返回当月最后一天 if detected_fields.day is None: month_last_day = calendar.monthrange(year, month)[1] return date(year, month, month_last_day) # 识别到完整年月日,直接返回精确日期 return date(year, month, parsed_res.day)
效果验证
对应所有提到的输入场景,返回结果完全符合业务要求:
- 输入
Sept 2022→ 返回2022-09-30(9月最后一天) - 输入
11/2022→ 返回2022-11-30(11月最后一天) - 输入
Jul 2022→ 返回2022-07-31(7月最后一天) - 输入
11/11/2021→ 返回2021-11-11(精确匹配传入的完整日期)
注意事项
- 代码里
dayfirst=True是适配dd/mm/yyyy完整日期格式,如果后续遇到mm/dd/yyyy格式的输入,把这个参数改成False即可 - 这里用到的
_parse是dateutil.parser的内部解析方法,从dateutil 2.x版本至今接口没有变动,覆盖所有支持的日期格式,比自己手写正则适配各种英文月份、分隔符的方案容错率高很多,不需要提前枚举所有可能的输入格式。
内容的提问来源于stack exchange,提问作者Simontaylor Zhang
相关产品推荐
相关产品推荐

