问题描述
我有一些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"}
}