【问题标题】:Round back to quarter-hour in Mulesoft Dataweave在 Mulesoft Dataweave 中舍入到一刻钟
【发布时间】:2021-12-29 19:39:09
【问题描述】:

我有一个 Mule Server 4.3.0 EE 应用程序,我想在其中将 DateTime 舍入到最近的一刻钟,结果也是 DateTime。一些例子:

  • 如果输入为上午 9:18:32,则输出为同一天上午 9:15:00
  • 如果输入为上午 9:33:33,则输出为同一天上午 9:30:00
  • 如果输入为上午 9:59:58,则输出为同一天上午 9:45:00
  • 如果输入为上午 10:00:00,则输出为同一天上午 10:00:00

在此应用程序中,输入将始终为纽约时间,DST 是否生效取决于一年中的时间。

这是我到目前为止的想法。保留日期和小时,将分钟截断到最接近的 15,将秒设置为零,并保留时区。 (“00”分钟有一个特殊情况,因为如果分钟是单个“0”,它不会转换。)

我知道较新的 Mule 版本具有 Dates 包,这将使这更加优雅,但目前升级不是我的选择。这是否与满足这些要求的代码一样好,或者是否有更好的方法可以在不升级 Mule 的情况下做到这一点?谢谢。

%dw 2.0
import * from dw::core::Strings
output application/json
fun roundBack(inputTime: DateTime): DateTime =
(inputTime[0 to 13] ++
    (if (inputTime.minutes < 15) '00' else (inputTime.minutes - mod(inputTime.minutes, 15) as String)) ++
    ':00' ++
    inputTime[-6 to -1]
) as DateTime

【问题讨论】:

    标签: datetime dataweave mulesoft


    【解决方案1】:

    我相信逻辑很好,但实现很脆弱,因为它依赖于自动强制(使用范围选择器 [] 时将日期时间转换为字符串)。我最好在转换中明确说明以避免由意外的默认格式和编辑器中的警告引起的问题:

    %dw 2.0
    import * from dw::core::Strings
    output application/json
    fun roundBack(inputTime: DateTime): DateTime =
        (
            inputTime as String {format: "yyyy-MM-dd HH:"} 
            ++ (if (inputTime.minutes < 15) 
                    '00' 
                else (inputTime.minutes - mod(inputTime.minutes, 15)) as String
            )
            ++':00' 
            ++ inputTime as String {format: "xxx"}
        ) as DateTime {format: "yyyy-MM-dd HH:mm:ssxxx"} 
    ---
    roundBack(|2020-10-01T23:57:59-04:00|)
    

    输出:"2020-10-01 23:45:00-04:00"

    【讨论】:

    • 谢谢,太好了!我将“...-dd HH:...”替换为“...-dd'T'HH:...”,这样结果就可以更容易地传递到需要日期时间输入的 API 中。
    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多