DataWeave DateTime转换报错:Unable to obtain ZonedDateTime from TemporalAccessor解决
问题解答
1. 单独时分秒转换DateTime报错的原因与解决
报错Unable to obtain ZonedDateTime from TemporalAccessor的核心原因:DateTime类型要求包含日期、时间、时区/偏移的完整时间信息,而"08:05:30"仅包含时间部分,属于LocalTime类型,无法直接转为DateTime。
解决方式:
- 仅处理时间场景:直接使用
LocalTime类型"08:05:30" as LocalTime{format: "hh:mm:ss"} as String{format: "hh:mm:ss"} - 必须转为
DateTime场景:补充日期和时区信息("08:05:30" as LocalTime{format: "hh:mm:ss"} ++ |2023-10-18|) as DateTime{timezone: "GMT"} as String{format: "hh:mm:ss"}
2. 目标日期字符串转换的正确实现
针对将"Wed Oct 18 2023 08:05:30 GMT-0000 (GMT)"转换为"2023-10-18T08:05:30+00:00"(匹配你给出的目标格式),你的尝试代码存在格式符不匹配、未指定Locale的问题,正确实现如下:
%dw 2.0 output application/json var inputDate = "Wed Oct 18 2023 08:05:30 GMT-0000 (GMT)" --- inputDate as DateTime { format: "E MMM dd yyyy HH:mm:ss zX (z)", locale: "en_US" } as String { format: "yyyy-MM-dd'T'HH:mm:ssXXX" }
关键细节说明:
- 解析格式符匹配:
"E MMM dd yyyy HH:mm:ss zX (z)"完全对应输入字符串结构:E:星期缩写(Wed)MMM:月份缩写(Oct)dd:日(18)yyyy:年(2023)HH:24小时制小时(输入无AM/PM标识,必须用HH而非hh)z:时区标识(GMT)X:±HHmm格式的偏移(-0000)(z):匹配括号内的时区注释内容((GMT))
- Locale指定:必须添加
locale: "en_US",否则默认Locale无法解析英文的星期/月份缩写 - 输出格式符:
"yyyy-MM-dd'T'HH:mm:ssXXX"生成±HH:mm格式的时区偏移,完全符合目标格式要求
执行结果:
代码运行后输出:
"2023-10-18T08:05:30+00:00"
内容的提问来源于stack exchange,提问作者YannickN.fr
相关产品推荐
相关产品推荐

