You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串时间范围校验实现:修复现有函数跨天场景校验失效问题

时间范围跨天校验函数解决方案

实现思路

核心将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:48:05