在 dataweave 2.0 中添加两个小时和分钟

问题描述 投票:0回答:2

我需要总结以下小时和分钟。

[{"hours": 20.50},{"hours":30.55}]

预期结果应该是:

[{"hours" : 51.45}]

如果在java中没有帮助我,你认为我如何在dataweave 2.0中添加小时数。

java json dataweave mulesoft
2个回答
3
投票

我不确定我们是否可以利用包含 DW 的时间类型来解决这个问题,所以我编写了一个使用自定义类型 HoursMinutes 的解决方案,让小时数大于 24,将 Number 解析为 HoursMinutes,添加他们,最后再次将其转换为 Number。

也许我把事情复杂化了...哈哈

%dw 2.0
output application/json

type HoursMinutes = {hour:Number, minute: Number}

fun toHours(n: Number): HoursMinutes = do {
    var split = n as String splitBy "."
    var fromMin = floor(split[1] as Number / 60)
    ---
    {hour:floor(n) + fromMin, minute:split[1] as Number mod 60}
}

fun add(hour1:HoursMinutes, hour2: HoursMinutes): HoursMinutes = do {
    var fromMin = floor((hour1.minute + hour2.minute) / 60)
    ---
    {hour: hour1.hour + hour2.hour + fromMin, minute: (hour1.minute + hour2.minute) mod 60}
}

fun toNumber(h: HoursMinutes) = (h.hour as String ++"."++ h.minute as String) as Number
---
[
    {
        "hours": toNumber(payload reduce ((item, accumulator:HoursMinutes = {hour:0, minute:0}) -> accumulator add toHours(item.hours)))
    }
]

0
投票

也可以尝试这个方法:

%dw 2.0
output application/json
import leftPad from dw::core::Strings
    var cumulativeHours = payload reduce(item, acc = {}) -> do{
        var hours = (item.hours  splitBy ":" ) [0] as Number 
        var minutes = (item.hours splitBy ":") [1] as Number
        var sumOfhours = acc.sumOfhours default 0
        var sumOfMinutes = acc.sumOfMinutes default 0
    ---
    {
        sumOfhours : sumOfhours + hours,
        sumOfMinutes: sumOfMinutes + minutes,
        hoursFromMinutes : floor((sumOfMinutes + minutes)/60),
        minutes : (sumOfMinutes + minutes) mod 60
        
    }
}

---
hours: "$(cumulativeHours.sumOfhours + 
       cumulativeHours.hoursFromMinutes):$(cumulativeHours.minutes)"
© www.soinside.com 2019 - 2024. All rights reserved.