DataWeave中如何判断指定timestamp是否处于给定时间区间内
时间区间判断代码修复方案
需求
校验指定时间戳(示例值:"22-07-15T16:00:00")是否满足:大于等于当日16:00:00、小于当日23:00:00的区间规则。
原代码问题
原错误代码:
((now() as String {format:"dd-MM-yyyy HH:mm:ss"}) >= (now() as String {format: "yy/MM/dd"} ++ "T16:00:00")) and < (now() as String {format: "yy/MM/dd"} ++ "T23:00:00")
存在3个核心问题:
- 语法错误:
and <是不完整的二元运算写法,小于号左侧缺失待比较的变量,语法不合法 - 格式不统一:待比较值用
dd-MM-yyyy HH:mm:ss格式(日在前、横杠分隔、带空格分隔时间),区间边界用yy/MM/dd格式(年在前、斜杠分隔),格式完全不匹配,字符串比较结果完全错误 - 逻辑风险:多次重复调用
now(),极端场景下代码执行跨天/跨秒时,会生成不属于同一天的边界值,导致判断逻辑异常
正确实现
校验指定时间戳版本
替换代码里的targetTs为你实际传入的时间戳变量即可:
// 待校验的目标时间戳 let targetTs = "22-07-15T16:00:00"; // 统一生成当日时间前缀,格式和目标时间戳完全对齐 let datePrefix = now() as String {format: "yy-MM-dd"}; let lowerLimit = datePrefix ++ "T16:00:00"; let upperLimit = datePrefix ++ "T23:00:00"; // 区间判断 targetTs >= lowerLimit and targetTs < upperLimit
校验当前时间版本
如果需要直接判断当前时间是否落在区间内,使用以下代码:
let datePrefix = now() as String {format: "yy-MM-dd"}; let currentTime = now() as String {format: "yy-MM-dd'T'HH:mm:ss"}; let lowerLimit = datePrefix ++ "T16:00:00"; let upperLimit = datePrefix ++ "T23:00:00"; currentTime >= lowerLimit and currentTime < upperLimit
关键注意点
- 用字符串比较时间先后的前提是所有时间字符串格式完全一致,必须保证年、月、日、时、分、秒都按从大到小的时间单位排序,位数不足补前导零,分隔符完全统一,否则字典序比较结果不符合时间先后逻辑
- 提前把时间边界、当前时间/目标时间赋值给变量后再比较,避免重复调用时间函数带来的临界值bug
内容的提问来源于stack exchange,提问作者obc
相关产品推荐
相关产品推荐

