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

问题描述

我有一些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"
    }
]

解决方法

您需要使用输入格式将字符串转换为日期,然后使用输出格式将日期转换为字符串。请注意,输入内容具有时区,因此不能是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" }
,

您遇到的问题是因为输入有效负载中的某些日期无效。请查看此问题以获取更多详细信息: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"}
}