Mulesoft DataWeave:日期字符串转Datetime的毫秒值问题求助
问题解决思路
核心问题分析
- 毫秒值为0的原因:你的输入字符串
23012021235129是ddMMyyyyHHmmss格式(12位),仅包含日、月、年、时、分、秒,没有毫秒段,因此解析为LocalDateTime时毫秒默认填充为0,最终格式化后显示.000。 - 日期时间未偏移的原因:你当前的代码只是给
LocalDateTime直接拼接了+01:00时区标识,但LocalDateTime不带时区信息,不会自动做时区转换,因此日期还是23号、时间23:51,和输入一致。
针对性解决方案
方案1:输入无毫秒信息,仅需时区转换(保留.000毫秒)
如果预期的.006只是示例,实际只需保证时区转换后的日期时间正确,可按以下步骤调整代码:
- 先将输入解析为
LocalDateTime; - 把该时间绑定到输入对应的时区(比如假设输入是UTC时间,这是导致日期从23号变24号的关键);
- 转换到目标时区
+01:00; - 格式化输出。
调整后的代码:
|23012021235129| as LocalDateTime {format: "ddMMyyyyHHmmss"}) as ZonedDateTime {timeZone: "UTC"}) as ZonedDateTime {timeZone: "+01:00"}) as String {format: "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"}
执行后结果为:2021-01-24T00:51:29.000+01:00,日期时间符合预期,毫秒位保留为0(因输入无毫秒信息)。
方案2:输入包含毫秒信息(需调整解析格式)
如果你的实际输入字符串包含毫秒(比如完整格式是ddMMyyyyHHmmssSSS,15位,示例输入应为23012021235129006),只需修改解析时的格式字符串,再配合时区转换即可得到目标结果:
调整后的代码:
|23012021235129006| as LocalDateTime {format: "ddMMyyyyHHmmssSSS"}) as ZonedDateTime {timeZone: "UTC"}) as ZonedDateTime {timeZone: "+01:00"}) as String {format: "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"}
执行后结果为:2021-01-24T00:51:29.006+01:00,完全匹配预期格式。
内容的提问来源于stack exchange,提问作者Hai Na Zheng
相关产品推荐
相关产品推荐

