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

Python中如何以更Pythonic的方式将字符串格式的日月转为日期

更Pythonic的实现方案

推荐优先用Python标准库实现,无需引入第三方依赖,代码更简洁易维护:

import re
from datetime import datetime

def convert_month_day_to_date(dm_str: str) -> str:
    # 直接获取当前年份,无需转字符串拆分
    current_year = datetime.now().year
    # 正则移除日期序数后缀(st/nd/rd/th)
    clean_dm = re.sub(r'(\d+)(st|nd|rd|th)', r'\1', dm_str)
    # 用strptime原生解析月份缩写,无需手动维护映射表
    date_obj = datetime.strptime(f"{clean_dm} {current_year}", "%d %b %Y")
    # 格式化为目标字符串格式
    return date_obj.strftime("%d/%m/%Y")

# 测试调用
print(convert_month_day_to_date("23rd Sep"))

主要优化点

  • 去除了不必要的第三方依赖(arrow),兼容性更强
  • 年份获取直接调用datetime.now().year属性,省略了不必要的字符串拆分操作
  • 不需要手动维护月份缩写到全称的映射字典,strptime的%b格式符原生支持匹配Jan、Sep这类英文月份缩写
  • 正则一次性处理所有序数后缀,覆盖1st/2nd/3rd/4th等所有场景,逻辑更清晰
  • 封装为可复用函数,后续可以很方便的扩展异常处理、自定义规则等能力

可选优化:处理跨年边界场景

如果你的业务场景中可能出现「当前是1月,输入的日期是上一年12月」的情况,可以加个简单的判断避免日期逻辑错误:

import re
from datetime import datetime

def convert_month_day_to_date(dm_str: str) -> str:
    now = datetime.now()
    current_year = now.year
    clean_dm = re.sub(r'(\d+)(st|nd|rd|th)', r'\1', dm_str)
    date_obj = datetime.strptime(f"{clean_dm} {current_year}", "%d %b %Y")
    # 若解析出的日期晚于当前日期,说明是上一年的日期,年份减1
    if date_obj > now:
        date_obj = date_obj.replace(year=current_year - 1)
    return date_obj.strftime("%d/%m/%Y")

注意事项

如果你的运行环境系统locale不是英文,月份缩写解析可能失败,可以在代码开头临时设置时间locale为英文:

import locale
locale.setlocale(locale.LC_TIME, 'en_US.UTF-8')

内容的提问来源于stack exchange,提问作者chuky pedro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:09:01