如何阻止EventCalendar加载时添加重叠事件?
如何阻止EventCalendar加载时添加重叠事件?
看起来你已经找对了重叠判断的核心思路,但问题大概率出在时间类型不匹配或者比较逻辑的细节处理上。咱们一步步来解决:
问题根源分析
你当前的过滤逻辑返回0,很大概率是因为:
ec.getEvents()返回的现有事件的start/end是Date对象,但你直接用newevent.start(原始字符串)去和Date对象比较,类型不匹配导致比较结果异常;- 或者反过来,现有事件的时间是字符串,直接用
<比较的是字符串字典序,而非实际时间先后。
修正后的解决方案
核心是统一所有比较时间的类型为Date对象,再用标准的时间段重叠判断逻辑:
// 先把新事件的时间转成标准Date对象 const newEventStart = new Date(newevent.start); const newEventEnd = new Date(newevent.end); // 过滤出与新事件重叠的现有事件 const overlappingEvents = ec.getEvents().filter(existingEvent => { // 确保现有事件的时间也转成Date对象(兼容字符串/Date两种情况) const existingStart = new Date(existingEvent.start); const existingEnd = new Date(existingEvent.end); // 通用的时间段重叠判断逻辑:两个区间有交集的条件 return existingStart < newEventEnd && newEventStart < existingEnd; }); // 根据重叠结果决定是否添加事件 if (overlappingEvents.length === 0) { // 无重叠,执行添加 ec.addEvent(newevent); console.log("事件添加成功"); } else { console.log(`发现${overlappingEvents.length}个重叠事件,已阻止添加`); }
额外验证步骤
如果还是有问题,可以先做这两步排查:
- 打印现有事件的时间类型:
console.log(typeof ec.getEvents()[0].start),确认是string还是Date; - 检查新事件的时间格式是否合法:
console.log(newEventStart, newEventEnd),确保没有出现Invalid Date的情况(如果有,需要先修正时间字符串的格式)。
补充说明
这个重叠判断逻辑是通用的:只要两个时间段满足「A的开始早于B的结束,且B的开始早于A的结束」,就说明存在重叠,这个逻辑覆盖了所有可能的重叠场景(包含、部分重叠等)。
备注:内容来源于stack exchange,提问作者Tom




