You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何阻止EventCalendar加载时添加重叠事件?

如何阻止EventCalendar加载时添加重叠事件?

看起来你已经找对了重叠判断的核心思路,但问题大概率出在时间类型不匹配或者比较逻辑的细节处理上。咱们一步步来解决:

问题根源分析

你当前的过滤逻辑返回0,很大概率是因为:

  1. ec.getEvents()返回的现有事件的start/endDate对象,但你直接用newevent.start(原始字符串)去和Date对象比较,类型不匹配导致比较结果异常;
  2. 或者反过来,现有事件的时间是字符串,直接用<比较的是字符串字典序,而非实际时间先后。

修正后的解决方案

核心是统一所有比较时间的类型为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}个重叠事件,已阻止添加`);
}

额外验证步骤

如果还是有问题,可以先做这两步排查:

  1. 打印现有事件的时间类型:console.log(typeof ec.getEvents()[0].start),确认是string还是Date;
  2. 检查新事件的时间格式是否合法:console.log(newEventStart, newEventEnd),确保没有出现Invalid Date的情况(如果有,需要先修正时间字符串的格式)。

补充说明

这个重叠判断逻辑是通用的:只要两个时间段满足「A的开始早于B的结束,且B的开始早于A的结束」,就说明存在重叠,这个逻辑覆盖了所有可能的重叠场景(包含、部分重叠等)。

备注:内容来源于stack exchange,提问作者Tom

火山引擎 最新活动