如何在Python中将多种日期时间格式转换为统一格式(DD/MM/YYYY)
解决方案:Python 统一多格式日期字符串为 DD/MM/YYYY
处理这类多格式日期转换的核心思路是逐个匹配已知格式解析,再统一输出目标格式。下面提供两种实用方案:
方案1:手动指定格式列表(精准可控)
适合已知所有输入格式的场景,避免自动解析带来的歧义(比如8/5/2023可能被误判为月/日/年或日/月/年)。
代码实现
from datetime import datetime def normalize_date(date_str): # 定义所有待匹配的输入格式,对应格式符说明: # %a 缩写星期名 | %b 缩写月份名 | %B 完整月份名 | %d 带前导零的日 | %Y 四位年份 | %y 两位年份 # %H:%M:%S 时分秒 | %z 时区偏移 | %Z 时区名 | %f 微秒 formats = [ "%a, %b %dth %Y", # 匹配 "Mon, Aug 7th 2023" "%a, %d %b %Y %H:%M:%S %z",# 匹配 "Fri, 04 Aug 2023 18:16:02 +0530" "%d-%b-%y", # 匹配 "7-Aug-23" "%B %d, %Y", # 匹配 "August 7, 2023" "%B %d, %Y %H:%M %Z", # 匹配 "August 9, 2023 19:12 IST" "%Y-%m-%dT%H:%M:%S.%fZ", # 匹配 "2023-08-07T21:31:45.000Z" "%Y-%m-%dT%H:%M:%S", # 匹配 "2023-08-07T20:45:09" "%m/%d/%Y %H:%M" # 匹配 "8/5/2023 21:22"(若实际是日/月/年,改为%d/%m/%Y %H:%M) ] for fmt in formats: try: dt = datetime.strptime(date_str, fmt) return dt.strftime("%d/%m/%Y") except ValueError: continue # 所有格式匹配失败时,可返回原字符串或抛出异常 raise ValueError(f"无法解析日期字符串: {date_str}") # 测试示例 test_dates = [ "Mon, Aug 7th 2023", "Fri, 04 Aug 2023 18:16:02 +0530", "7-Aug-23", "August 7, 2023", "August 9, 2023 19:12 IST", "2023-08-07T21:31:45.000Z", "2023-08-07T20:45:09", "8/5/2023 21:22" ] for date in test_dates: try: print(f"{date} → {normalize_date(date)}") except ValueError as e: print(e)
关键注意点
- 带
th/st/nd/rd后缀的日期(如7th),strptime的%d会自动忽略后缀,无需额外处理。 - 对于
8/5/2023这类歧义格式,必须根据实际数据规则调整格式字符串中的%m/%d或%d/%m顺序。
方案2:使用dateutil.parser(灵活自动解析)
如果输入格式可能扩展,dateutil.parser可自动识别绝大多数常见日期格式,无需手动枚举。需先安装依赖:pip install python-dateutil
代码实现
from dateutil import parser def normalize_date(date_str): # ignoretz=True 忽略时区信息,避免时区对日期计算的影响 dt = parser.parse(date_str, ignoretz=True) return dt.strftime("%d/%m/%Y") # 测试示例 test_dates = [ "Mon, Aug 7th 2023", "Fri, 04 Aug 2023 18:16:02 +0530", "7-Aug-23", "August 7, 2023", "August 9, 2023 19:12 IST", "2023-08-07T21:31:45.000Z", "2023-08-07T20:45:09", "8/5/2023 21:22" ] for date in test_dates: try: print(f"{date} → {normalize_date(date)}") except parser.ParserError as e: print(f"无法解析日期字符串: {date} - {e}")
关键注意点
- 歧义格式(如
8/5/2023)默认按美式习惯(月/日/年)解析,若需欧式规则(日/月/年),添加参数dayfirst=True即可:parser.parse(date_str, dayfirst=True, ignoretz=True)。
内容的提问来源于stack exchange,提问作者Mah3sh
相关产品推荐
相关产品推荐

