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

