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

如何用DataWeave处理Payload多格式日期并转换为MM-dd-yyyy

统一多格式日期为MM-dd-yyyy的解决方案

思路1:枚举已知格式逐一解析

既然已经明确了可能存在的日期格式集合,最稳妥的方式是先定义所有可能的输入格式,逐个尝试解析,成功后再转换为目标格式。

Python 示例代码

from datetime import datetime

# 定义所有可能的输入日期格式
input_formats = [
    "%m/%d/%Y",
    "%m/%d/%y",
    "%m-%d-%Y",
    "%m-%d-%y"
]

def normalize_date(date_str):
    for fmt in input_formats:
        try:
            dt = datetime.strptime(date_str, fmt)
            # 转换为目标格式 MM-dd-yyyy
            return dt.strftime("%m-%d-%Y")
        except ValueError:
            continue
    # 所有格式匹配失败时,可根据需求抛出异常或返回原字符串
    raise ValueError(f"无法解析日期: {date_str}")

# 测试输入数据
input_data = [
    {"date": "01-03-2023"},
    {"date": "01-03-23"},
    {"date": "01/03/2023"},
    {"date": "01/03/23"}
]

# 转换处理
output_data = [{"date": normalize_date(item["date"])} for item in input_data]
print(output_data)

运行后输出:

[
    {'date': '01-03-2023'},
    {'date': '01-03-2023'},
    {'date': '01-03-2023'},
    {'date': '01-03-2023'}
]

思路2:使用智能日期解析库

如果后续可能出现更多未知格式,可以借助支持自动识别日期的库,无需手动枚举所有格式。

Python 示例(使用dateutil)

from dateutil import parser
from datetime import datetime

def normalize_date(date_str):
    dt = parser.parse(date_str)
    return dt.strftime("%m-%d-%Y")

# 上述测试输入数据同样适用此方法

Java 示例(使用宽松模式解析)

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class DateNormalizer {
    public static void main(String[] args) {
        // 构建支持多格式的宽松解析器
        DateTimeFormatter parser = new DateTimeFormatterBuilder()
                .appendPattern("[MM/dd/yyyy][MM/dd/yy][MM-dd-yyyy][MM-dd-yy]")
                .parseDefaulting(ChronoField.YEAR_OF_ERA, 2000) // 两位年份默认补20前缀
                .toFormatter();

        List<Map<String, String>> inputData = List.of(
                Map.of("date", "01-03-2023"),
                Map.of("date", "01-03-23"),
                Map.of("date", "01/03/2023"),
                Map.of("date", "01/03/23")
        );

        List<Map<String, String>> outputData = new ArrayList<>();
        DateTimeFormatter targetFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy");

        for (Map<String, String> item : inputData) {
            String dateStr = item.get("date");
            LocalDate date = LocalDate.parse(dateStr, parser);
            outputData.add(Map.of("date", targetFormatter.format(date)));
        }

        System.out.println(outputData);
    }
}

注意事项

  • 两位年份解析:默认会按当前世纪处理(如23转为2023),如果需要自定义逻辑(比如1950及以上归为19xx,以下归为20xx),可在解析后添加额外判断调整年份。
  • 异常处理:实际应用中要捕获解析失败的情况,避免程序崩溃,可根据业务需求返回原字符串或标记无效日期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:03:11