You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将"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)

错误原因分析

  1. 未转义固定字符:DataWeave的日期格式字符串中,未用单引号包裹的T会被识别为格式占位符,而非时间字符串里的固定分隔符,导致报错Unknown pattern letter: T。
  2. 时区类型不匹配:输入时间带Z(UTC时区标识),LocalDateTime不支持时区信息,应该使用ZonedDateTime来处理带时区的时间字符串。
  3. 冗余依赖:导入的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:46:03