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
相关产品推荐
相关产品推荐

