簡體   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