在dataweave 2.0中将格式为EEE MMM dd HH:mm:ss zzz yyyy的日期转换为dd / MM / yyyy

时间:2020-10-15 12:12:17

标签: date datetime mule dataweave

我有一些EEE MMM dd HH:mm:ss zzz yyyy格式的SAP日期。例如,Mon Sep 02 00:00:00 BST 2019。我需要使用dataweave 2.0将其转换为dd/MM/yyyy,但是直到现在我仍然没有成功。

我认为此转换可能运行良好,但事实并非如此:

%dw 2.0
output application/json
---
{
    timestamp: "Mon Sep 02 00:00:00 BST 2019" as LocalDateTime {format: "EEE MMM dd HH:mm:ss zzz yyyy"} >> "BST" as String {format: "dd/MM/yyyy"}
}

我必须转换的数据要复杂一些:

[
    {
        "id": 1,
        "timestamp": "Tue Jan 06 00:00:00 BST 2000"
    },
    {
        "id": 2,
        "timestamp": "Sun Dec 05 00:00:00 BST 2015"
    },
    {
        "id": 3,
        "timestamp": "Mon Oct 04 00:00:00 BST 2017"
    },
    {
        "id": 4,
        "timestamp": "Sat Jul 03 00:00:00 BST 2020"
    },
    {
        "id": 5,
        "timestamp": "Mon Sep 02 00:00:00 BST 2019"
    }
]

2 个答案:

答案 0 :(得分:2)

您需要使用输入格式将字符串转换为日期,然后使用输出格式将日期转换为字符串。请注意,输入内容具有时区,因此不能是LocalDateTime。

%dw 2.0
output application/json
---
"Mon Sep 02 00:00:00 BST 2019" as DateTime {format: "EEE MMM dd HH:mm:ss zzz yyyy"} as String { format: "dd/MM/yyyy" }

您输入的星期几不正确。我固定为:

[
    {
        "id": 1,
        "timestamp": "Thu Jan 06 00:00:00 BST 2000"
    },
    {
        "id": 2,
        "timestamp": "Sat Dec 05 00:00:00 BST 2015"
    },
    {
        "id": 3,
        "timestamp": "Wed Oct 04 00:00:00 BST 2017"
    },
    {
        "id": 4,
        "timestamp": "Fri Jul 03 00:00:00 BST 2020"
    },
    {
        "id": 5,
        "timestamp": "Mon Sep 02 00:00:00 BST 2019"
    }
]

要解析每个时间戳并返回一个数组,可以使用:

%dw 2.0
output application/json
---
payload map $.timestamp as DateTime {format: "EEE MMM dd HH:mm:ss zzz yyyy"} as String { format: "dd/MM/yyyy" }

答案 1 :(得分:2)

您遇到的问题是因为输入有效负载中的某些日期无效。请查看此问题以获取更多详细信息:Caused by: java.time.DateTimeException: Conflict found: Field DayOfWeek 6 differs from DayOfWeek 2 derived from 2016-01-30

如果您修复了无效条目的星期几,则dataweave表达式将按预期工作(确保每个时间戳记中的星期几与实际的星期几相对应)。

此外,请确保将时间戳转换为DateTime,因为它包含时区:

%dw 2.0
output application/json
---
payload map (item, index) -> 
{
    timestamp: item.timestamp as DateTime {format: "EEE MMM dd HH:mm:ss zzz yyyy"} as Date {format: "dd/MM/yyyy"}
}