将"yyyy-MM-dd'T'HH:mm:ss.SSSZ"时间戳转为"yyyyMMdd"报错排查
问题:DataWeave时间格式转换报错排查与解决
需求与原始代码
需求:将格式为yyyy-MM-dd'T'HH:mm:ss.SSSZ的时间戳转换为yyyyMMdd格式。
示例输入:
{ "transactionDateTime": "2023-12-05T16:56:15.912Z" }
原始DataWeave代码:
%dw 2.0 import * from dw::core::Strings var date = payload.transactionDateTime as LocalDateTime {format: "yyyy-MM-dd'T'HH:mm:ss.SSSZ"} as String {format: "yyyyMMdd"} output application/json --- { "k": date }
报错信息
Cannot coerce String (2023-12-05T16:56:15.912Z) to LocalDateTime, caused by: Unknown pattern letter: T 14| var CURRENTDATEOriginalPostDate = payload.transactionDateTime as LocalDateTime {format:"yyyy-MM-ddTHH:mm:ss.SSSZ"} as String {format:"yyyy-MM-dd"} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Trace: at main::main (line: 14, column: 35)
错误原因分析
- 未转义固定字符:DataWeave的日期格式字符串中,未用单引号包裹的
T会被识别为格式占位符,而非时间字符串里的固定分隔符,导致报错Unknown pattern letter: T。 - 时区类型不匹配:输入时间带
Z(UTC时区标识),LocalDateTime不支持时区信息,应该使用ZonedDateTime来处理带时区的时间字符串。 - 冗余依赖:导入的
dw::core::Strings包未被使用,属于无效导入。
修复后的代码
简洁版
%dw 2.0 output application/json --- { "k": (payload.transactionDateTime as ZonedDateTime {format: "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"}) as String {format: "yyyyMMdd"} }
分步版(可读性更高)
%dw 2.0 output application/json // 先将字符串转为带时区的日期对象 var zonedDateTime = payload.transactionDateTime as ZonedDateTime {format: "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"} // 再格式化为目标字符串格式 var formattedDate = zonedDateTime as String {format: "yyyyMMdd"} --- { "k": formattedDate }
修复说明
- 替换
LocalDateTime为ZonedDateTime,适配带Z时区标识的输入时间; - 用单引号包裹格式字符串中的
T和Z,明确它们是固定字符而非格式占位符; - 移除了无用的
Strings包导入。
内容的提问来源于stack exchange,提问作者Hasan Limon
相关产品推荐
相关产品推荐

