繁体   English   中英

DataWeave 2.0 将时间差作为一个周期

[英]DataWeave 2.0 get time difference as a period

我有如下所示的 DataWeave 代码:

%dw 2.0
output application/java
var timezone = (now() >> "Pacific/Auckland") as String {format: "XXX"}
var t1 = '08:00:00.000' ++ timezone
var t2 = '21:00:00.000' ++ timezone
---
(|PT24H| - (t2-t1)) 

这导致以秒为单位的响应为 39600,即 11 小时。 我希望响应为 |PT11H| 而不是 39600。当我们将秒数除以 3600 到 11 小时时,它可以工作,但我们需要它像 |PT11H| 而不是39600。

以上输入 t1 和 t2 来自配置。 我们无法更改设置。

您可以使用dw::core::Periods模块的seconds函数。 它将秒数作为参数并返回一个周期。

%dw 2.0
import seconds from dw::core::Periods
output application/java

var timezone = (now() >> "Pacific/Auckland") as String {format: "XXX"}
var t1 = '08:00:00.000' ++ timezone
var t2 = '21:00:00.000' ++ timezone
---
seconds( |PT24H| - (t2 - t1) ) 

另一个建议,因为您正在处理时间段和时差,所以时区并不重要。 您可以将代码减少到 datawave 以下

%dw 2.0
import seconds from dw::core::Periods
output application/java

var t1 = '08:00:00.000' as Time
var t2 = '21:00:00.000' as Time
---
seconds( |PT24H| - (t2 - t1) )  

DataWeave 2.4 版和 Mule Runtime 4.4 中的“秒”功能在周期模块下引入

参考:秒 | MuleSoft 文档https://docs.mulesoft.com/dataweave/2.4/dw-periods-functions-seconds

因此,如果您的 Mule 运行时版本低于 4.4,那么您必须按照问题本身所述除以 3600。

对于使用低于 4.4 的 Mule 运行时版本的开发人员,以下也是该解决方案

第一的:

%dw 2.0
output application/java
var timezone = (now() >> "Pacific/Auckland") as String {format: "XXX"}
var t1 = '08:00:00.000' ++ timezone
var t2 = '21:00:00.000' ++ timezone
---
"|PT" ++ (|PT24H| - (t2-t1))/3600 ++ "H|"

解释:由于 (|PT24H| - (t2-t1)) 给出 '39600' 作为以秒为单位的结果,现在要将秒转换为分钟,您需要除以 60,然后将分钟转换为小时,您需要再次除以 60,因此您可以直接除以 (60 * 60 即 3600) 并获得小时数。

根据评论中的建议,如果时间不是精确的小时,​​那么我们可以使用下面的 DataWeave 脚本

第二:

%dw 2.0
output application/java
var timezone = (now() >> "Pacific/Auckland") as String {format: "XXX"}
var t1 = '08:00:00.000' ++ timezone
var t2 = '21:00:00.000' ++ timezone
---
"PT$(|PT24H| - (t2-t1))S" as Period

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM