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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:24:53