字符串时间范围校验实现:修复现有函数跨天场景校验失效问题
时间范围跨天校验函数解决方案
实现思路
核心将HH:mm格式的时间字符串转换为当日分钟数进行数值比较,区分允许时间段跨天/非跨天两种场景分别处理,完全兼容原有函数的入参、返回值逻辑:
- 返回
true:待校验区间超出允许范围(无效) - 返回
false:待校验区间完全在允许范围内(有效)
前提约定
所有入参均为24小时制HH:mm格式字符串,默认待校验的监控区间为单日区间(即initialTime < finalTime,不存在跨天)。
完整实现代码
// 工具函数:将HH:mm格式时间转换为当日分钟数 const timeToMinutes = (timeStr) => { const [hour, minute] = timeStr.split(':').map(Number); return hour * 60 + minute; }; export default function isOutRangeStringTime({ initialTime, finalTime, allowedInitialTime, allowedFinalTime, }) { // 非法入参直接判定为超出范围 if ( allowedInitialTime === allowedFinalTime || initialTime >= finalTime ) { return true; } // 统一转成分钟数做数值计算,避免字符串比较的潜在问题 const checkStart = timeToMinutes(initialTime); const checkEnd = timeToMinutes(finalTime); const allowStart = timeToMinutes(allowedInitialTime); const allowEnd = timeToMinutes(allowedFinalTime); // 场景1:允许时间段不跨天,逻辑和原有实现保持一致 if (allowStart < allowEnd) { return checkStart < allowStart || checkEnd > allowEnd; } // 场景2:允许时间段跨天,允许区间为 [允许开始, 24:00) + [00:00, 允许结束] // 待校验区间完全落在前半段或后半段则属于有效范围 const isInFirstPart = checkStart >= allowStart && checkEnd <= 1440; const isInSecondPart = checkStart >= 0 && checkEnd <= allowEnd; return !(isInFirstPart || isInSecondPart); }
测试用例验证
跨天允许场景(允许时间段:23:00~次日04:00)
- 待校验区间
23:30~03:50:返回false(有效) - 待校验区间
01:00~02:00:返回false(有效) - 待校验区间
22:00~23:30:返回true(无效) - 待校验区间
03:30~04:30:返回true(无效) - 待校验区间
05:00~06:00:返回true(无效)
非跨天允许场景(允许时间段:09:00~18:00)
- 待校验区间
10:00~17:00:返回false(有效) - 待校验区间
08:00~10:00:返回true(无效) - 待校验区间
17:00~19:00:返回true(无效)
若业务需要支持待校验区间也跨天的场景,可将待校验区间拆分为两个单日区间,分别调用该校验函数判断即可。
内容的提问来源于stack exchange,提问作者David Bastos
相关产品推荐
相关产品推荐

