如何在MuleSoft DataWeave表达式中从日期提取年份(附报错代码)
解决MuleSoft DataWeave提取带|的日期年份问题
原代码的问题点
- 参数类型不匹配:函数
myDate定义参数为DateTime类型,但实际传入的是带|的字符串(如|2000-03-29|),类型冲突导致报错。 - 日期格式定义错误:自定义类型
LocalDateFormat用了带时间的格式yyyy-MM-dd'T'HH:mm:ss,但实际日期是纯日期格式yyyy-MM-dd,格式不匹配无法转换。 - 函数调用参数名错误:调用时用
text:$.Date_of_Birth__c,但函数参数名是myDateString,参数名不对应。 - 空值判断逻辑错误:
isEmpty和isWhitespace仅适用于字符串类型,不能直接用于DateTime类型。
修正后的代码方案
方案一:使用自定义日期类型
%dw 2.0 output application/json // 定义匹配纯日期格式的LocalDate类型 type DateOnlyFormat = LocalDate { format: "yyyy-MM-dd" } // 提取年份的工具函数 fun extractYear(dateStr: String): String = if (isEmpty(dateStr) or isWhitespace(dateStr)) "" else // 清理日期字符串,去掉前后的|符号 let cleanedDate = dateStr replace /^\|(.*)\|$/ with "$1" // 尝试转换日期并提取年份,失败则返回空字符串 in try(() -> (cleanedDate as DateOnlyFormat).year as String) otherwise "" --- payload map { "Birth Year": extractYear($.Date_of_Birth__c) default "" }
方案二:直接使用parseDate函数
如果不想自定义类型,也可以用parseDate直接转换:
%dw 2.0 output application/json fun extractYear(dateStr: String): String = if (isEmpty(dateStr) or isWhitespace(dateStr)) "" else let cleanedDate = dateStr replace /^\|(.*)\|$/ with "$1" in try(() -> (parseDate(cleanedDate, "yyyy-MM-dd")).year as String) otherwise "" --- payload map { "Birth Year": extractYear($.Date_of_Birth__c) default "" }
关键修正说明
- 清理日期字符串:用正则表达式
/^\|(.*)\|$/匹配前后的|,替换为中间的日期内容。 - 异常处理:用
try...otherwise捕获日期转换失败的情况(比如无效日期格式),避免整个流程报错。 - 类型匹配:将函数参数改为
String,与实际传入的日期字符串类型一致。 - 正确的日期类型:用
LocalDate处理纯日期(无时间部分),格式定义为yyyy-MM-dd。
内容的提问来源于stack exchange,提问作者robbins
相关产品推荐
相关产品推荐

