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';
}
时间间隔2
于 2025-01-18 03:34:19 首次发布