带时区的 Dataweave 日期格式

问题描述

我正在尝试将日期格式化为以下格式,UTC 与时区偏移:

预期: 2021-01-20T21:00:00-06:00

实际: 2021-01-20T00:00:00-06:00

代码

var arrivedAt = "2021-01-20T15:00:00"
var timezone = "America/Chicago"

var finalDateTime = (((arrivedAt as Date) as String {format: "yyyy-MM-dd'T'00:00:00"}) as LocalDateTime ++ (timezone as String)) 

我假设这是由于格式中的“00:00:00”,但是当我尝试使用“HH”或“hh”时,我收到了错误

解决方法

好消息是它已记录在此处https://docs.mulesoft.com/mule-runtime/4.3/dataweave-cookbook-change-time-zone

此示例代码为原始日期分配一个时区,然后将其转换为 UTC

var arrivedAt = "2021-01-20T15:00:00"
var timezone = "America/Chicago"
var dateWithTimezone = (arrivedAt as LocalDateTime) ++ "America/Chicago"
// dateWithTimezone = "2021-01-20T15:00:00-06:00"
var dateOnUTC = dateWithTimezone >> "UTC"
// dateOnUTC = "2021-01-20T21:00:00Z"
--- 
dateOnUTC as String { format: "yyyy-MM-dd'T'HH:mm:ssXXX"}

注意:我不确定问题的预期值是否正确,或者示例日期是否错误。

,

您似乎使用了不正确的数据类型并尝试将日期转换为字符串。这是非常不明智的。错误可能是因为 Date 既没有时间也没有时区。

另一种方法是将日期时间视为 DateTime,以便能够使用时区功能:

%dw 2.0
output application/json
var arrivedAt = "2021-01-20T15:00:00"
var timezone = "America/Chicago"

var finalDateTime = (arrivedAt as DateTime >> timezone ) as String {format: "yyyy-MM-dd'T'HH:mm:ssZ"}
---
finalDateTime

输出

"2021-01-20T09:00:00-0600"

实际上,正确的小时数似乎是 9 而不是您预期的结果中的 21。也许你做了相反的时区转换?