DataWeave 2.0计算时间差如何返回|PT11H|格式Period而非秒数值
DataWeave时间差返回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|格式的Period类型值,而非纯秒数。
约束条件:入参t1、t2来自固定配置,不允许修改原有配置的取值逻辑。
解决方案
直接导入DataWeave核心内置的dw::core::Periods模块,使用seconds函数将计算得到的秒级差值转换为Period类型即可,无需手动做小时换算,修改后完整代码:
%dw 2.0 output application/java import * from dw::core::Periods var timezone = (now() >> "Pacific/Auckland") as String {format: "XXX"} var t1 = '08:00:00.000' ++ timezone var t2 = '21:00:00.000' ++ timezone var diffInSeconds = |PT24H| - (t2 - t1) --- seconds(diffInSeconds)
原理说明
- 原代码中
|PT24H|是Period类型值,和(t2-t1)计算得到的DateTime时间差做算术运算时,DataWeave会自动将Period类型转换为秒级数值参与计算,最终返回结果是Number类型的秒数,而非Period类型。 seconds()函数是Periods模块提供的内置转换方法,接收数值类型的秒数入参,直接返回对应时长的Period类型值,上述代码执行后会直接输出|PT11H|,完全符合需求。- 方案全程未修改t1、t2的原有取值逻辑,满足配置不可修改的约束。
内容的提问来源于stack exchange,提问作者Infinity
相关产品推荐
相关产品推荐

