在 Mulesoft Dataweave 中倒回到一刻钟
Round back to quarter-hour in Mulesoft Dataweave
我有一个 Mule Server 4.3.0 EE 应用程序,我想在其中将 DateTime 舍入到它最近的一刻钟,结果也是一个 DateTime。一些例子:
- 如果输入是 9:18:32 AM,则输出是当天 9:15:00 AM
- 如果输入是 9:33:33 AM,则输出是 9:30:00 AM 当天
- 如果输入是 9:59:58 AM,则输出是 9:45:00 AM 当天
- 如果输入是 10:00:00 AM,那么输出是当天 10:00:00 AM
在此应用程序中,输入将始终采用纽约时间,夏令时是否生效取决于一年中的时间。
这是我到目前为止的想法。保留日期和小时,将分钟截断到最接近的 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
我认为逻辑很好,但实现很脆弱,因为它依赖于自动强制转换(使用范围选择器 [] 时将日期时间转换为字符串)。我最好在转换中明确说明以避免由意外的默认格式和编辑器中的警告引起的问题:
%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"
我有一个 Mule Server 4.3.0 EE 应用程序,我想在其中将 DateTime 舍入到它最近的一刻钟,结果也是一个 DateTime。一些例子:
- 如果输入是 9:18:32 AM,则输出是当天 9:15:00 AM
- 如果输入是 9:33:33 AM,则输出是 9:30:00 AM 当天
- 如果输入是 9:59:58 AM,则输出是 9:45:00 AM 当天
- 如果输入是 10:00:00 AM,那么输出是当天 10:00:00 AM
在此应用程序中,输入将始终采用纽约时间,夏令时是否生效取决于一年中的时间。
这是我到目前为止的想法。保留日期和小时,将分钟截断到最接近的 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
我认为逻辑很好,但实现很脆弱,因为它依赖于自动强制转换(使用范围选择器 [] 时将日期时间转换为字符串)。我最好在转换中明确说明以避免由意外的默认格式和编辑器中的警告引起的问题:
%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"