时间间隔2

	checkConflict(limitDuration, judgeDate) {
      // 将时间字符串分割成不同部分
      const durationDate = limitDuration.slice(0, 39);
      const durationHour = limitDuration.slice(40);
      let mainLimit = durationDate.split('~');
      let dailyLimit = durationHour.split('~');
      const judgeParts = judgeDate.split('~');

      // 解析时间字符串为 Date 对象
      const mainStart = new Date(mainLimit[0]);
      const mainEnd = new Date(mainLimit[1]);
      // 使用 judgeParts[0] 的日期部分来拼接 dailyLimit 的时间
      const dailyStart = new Date(
        judgeParts[0].split(' ')[0] + ' ' + dailyLimit[0]
      );
      const dailyEnd = new Date(
        judgeParts[0].split(' ')[0] + ' ' + dailyLimit[1]
      );
      const judgeStart = new Date(judgeParts[0]);
      const judgeEnd = new Date(judgeParts[1]);

      // 检查主禁止时间段是否有交集,包含相等的情况
      const hasMainIntersection =
        judgeStart <= mainEnd && judgeEnd >= mainStart;
      if (!hasMainIntersection) {
        return false;
      }

      // 计算主禁止时间段和判断时间段的交集
      const intersectionStart = judgeStart > mainStart ? judgeStart : mainStart;
      const intersectionEnd = judgeEnd < mainEnd ? judgeEnd : mainEnd;

      // 检查交集部分是否与每天的禁止时间段有交集,包含相等的情况
      const hasDailyIntersection =
        intersectionStart <= dailyEnd && intersectionEnd >= dailyStart;
      return hasDailyIntersection;
    },
    judgeA(interval, startJudge, endJudge) {
      const [startStr, endStr] = interval.split('~');
      let startLimit = new Date(startStr);
      let endLimit = new Date(endStr);
      if (
        (startJudge <= endLimit && endJudge >= startLimit) ||
        (startLimit <= endJudge && endLimit >= startJudge)
      ) {
        return true;
      }
      return false;
    },
    judgeB(interval, startJudge, endJudge) {
      const [startStr, endStr] = interval.split('~');
      const startParts = startStr.split(':').map(Number);
      const endParts = endStr.split(':').map(Number);
      let startLimit = new Date(
        startJudge.getFullYear(),
        startJudge.getMonth(),
        startJudge.getDate(),
        startParts[0],
        startParts[1],
        0
      );
      let endLimit = new Date(
        startJudge.getFullYear(),
        startJudge.getMonth(),
        startJudge.getDate(),
        endParts[0],
        endParts[1],
        59
      );
      if (
        (startJudge <= endLimit && endJudge >= startLimit) ||
        (startLimit <= endJudge && endLimit >= startJudge)
      ) {
        return true;
      }
      return false;
    },
    hasIntersection(judgeDate, limitDuration) {
      const [startJudge, endJudge] = judgeDate
        .split('~')
        .map((date) => new Date(date));
      const limitIntervals = limitDuration.split(';');
      for (const interval of limitIntervals) {
        let startLimit, endLimit;
        if (this.classifyDateIntervals(interval) === 'A') {
          // 处理完整的日期范围,格式为 YYYY-MM-DD HH:MM:SS~YYYY-MM-DD HH:MM:SS
          return this.judgeA(interval, startJudge, endJudge);
        } else if (this.classifyDateIntervals(interval) === 'B') {
          // 处理仅包含时间的范围,格式为 HH:MM~HH:MM
          return this.judgeB(interval, startJudge, endJudge);
        } else if (this.classifyDateIntervals(interval) === 'C') {
          // 处理组合格式 YYYY-MM-DD HH:MM:SS~YYYY-MM-DD HH:MM:SS HH:MM~HH:MM
          return this.checkConflict(interval, judgeDate);
        }
      }
      return false;
    },
    classifyDateIntervals(dateInterval) {
      // 匹配 YYYY-MM-DD HH:MM:SS~YYYY-MM-DD HH:MM:SS
      const fullDateRangeRegex =
        /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}~\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
      // 匹配 HH:MM~HH:MM
      const timeRangeRegex = /^\d{2}:\d{2}~\d{2}:\d{2}$/;
      // 匹配 YYYY-MM-DD HH:MM:SS~YYYY-MM-DD HH:MM:SS HH:MM~HH:MM
      const combinedRegex =
        /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}~\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (\d{2}:\d{2}~\d{2}:\d{2})$/;

      if (fullDateRangeRegex.test(dateInterval)) {
        return 'A';
      } else if (timeRangeRegex.test(dateInterval)) {
        return 'B';
      } else if (combinedRegex.test(dateInterval)) {
        return 'C';
      }
      return 'Invalid format';
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值