【问题标题】:Convert date with format EEE MMM dd HH:mm:ss zzz yyyy to dd/MM/yyyy in dataweave 2.0在 dataweave 2.0 中将日期格式为 EEE MMM dd HH:mm:ss zzz yyyy 转换为 dd/MM/yyyy
【发布时间】:2021-01-29 22:09:05
【问题描述】:

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

【问题讨论】:

  • 尝试双引号时间戳:%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"} } 如果它不起作用,请在您的问题中包含输入有效负载示例。谢谢
  • @mhery 输入的是日期还是字符串?
  • @olamiral,我的错。我已经尝试过使用双引号。我刚刚添加了一个输入有效负载,但我首先尝试更简单并使用示例中的字符串进行转换。
  • @aled,输入的是字符串,是其他API的响应

标签: date datetime mule dataweave


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。通过第一次转换,我得到了Cannot coerce String (Mon Sep 02 00:00:00 BST 2019) to DateTime, caused by: Text 'Mon Sep 02 00:00:00 BST 2019' could not be parsed at index 0。第二个几乎相同的错误:Cannot coerce String (Thu Jan 06 00:00:00 BST 2000) to DateTime, caused by: Text 'Thu Jan 06 00:00:00 BST 2000' could not be parsed at index 0。我正在为这个项目使用 Studio v7.5.0。
  • 在我的测试中有效。您是在预览中还是在执行应用程序时看到的?哪个版本的骡子?也请尝试使用当前版本的 Studio 7.6.0。
  • 问题是由于我的区域设置而不是 en/us 而发生的。 olamiral 在他的回答中帮助了我。感谢您的回复!
【解决方案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"}
}

【讨论】:

  • 我尝试使用示例的星期一日期,这是正确的,但得到了与aled响应相同的错误:"Cannot coerce String (Mon Sep 02 00:00:00 BST 2019) to DateTime, caused by: Text 'Mon Sep 02 00:00:00 BST 2019' could not be parsed at index 0
  • 能否请您确认您的操作系统中配置的区域设置/语言是什么?
  • 地区:巴西,语言:葡萄牙语(巴西)
  • 好的。尝试将您的 Eclipse 语言环境/语言更改为 en us。或者将 Mon 和 Sep 转换为该语言环境中的等效项(例如,Mon 的 Seg 和 Sep 的 Set),并查看时间戳是否被正确解析。要更改您的 Anypoint Studio 语言环境,请检查以下问题:stackoverflow.com/questions/4947484/…。你也可以查看这篇文章:help.mulesoft.com/s/article/…
猜你喜欢
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
相关资源
最近更新 更多