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

Chrome扩展中Google Calendar 30分钟空闲时段高效查询方案

高效查找Google Calendar中30分钟空闲时段的方案

不用每次递增5分钟暴力查询,最优方案是一次性获取目标时间范围内的所有忙碌事件,再从时间间隙中筛选出30分钟的空闲窗口,只需要调用一次Google Calendar FreeBusy API,效率和优雅度都能拉满。

具体步骤:

  1. 批量获取目标时间范围的忙碌数据
    先确定你要查询的整体时间范围(比如今天全天、未来3天或者一周),把这个范围作为timeMin和timeMax传给FreeBusy接口,一次请求拿到所有忙碌时段的集合。

修改后的请求参数示例:

// 比如查询从当前时间到未来7天的所有忙碌事件
const now = new Date();
const sevenDaysLater = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);

const dateObj = {
  timeMin: now.toISOString(),
  timeMax: sevenDaysLater.toISOString(),
  items: [{ id: calendarId }],
  timeZone: "America/Vancouver",
};

const requestOptions = {
  method: "POST",
  headers: {
    Authorization: "Bearer " + token,
    "Content-Type": "application/json",
  },
  body: JSON.stringify(dateObj),
};

// 发起请求获取忙碌数据
const response = await fetch("https://www.googleapis.com/calendar/v3/freeBusy", requestOptions);
const data = await response.json();
const busyPeriods = data.calendars[calendarId].busy || [];
  1. 从时间间隙中筛选30分钟空闲窗口
    把拿到的忙碌时段按开始时间排序,然后遍历计算各个时间节点之间的间隙,找出时长≥30分钟的窗口:
const requiredFreeMinutes = 30;
const requiredFreeMs = requiredFreeMinutes * 60 * 1000;
const freeSlots = [];
const queryStart = new Date(dateObj.timeMin);
const queryEnd = new Date(dateObj.timeMax);

// 先给忙碌时段按开始时间排序
busyPeriods.sort((a, b) => new Date(a.start) - new Date(b.start));

// 处理第一个忙碌事件之前的时间
if (busyPeriods.length === 0) {
  // 整个查询范围都是空闲的
  freeSlots.push({ start: queryStart, end: queryEnd });
} else {
  let prevEnd = queryStart;
  for (const busy of busyPeriods) {
    const busyStart = new Date(busy.start);
    // 计算当前间隙的时长
    const gapDuration = busyStart.getTime() - prevEnd.getTime();
    if (gapDuration >= requiredFreeMs) {
      // 这个间隙里有符合要求的空闲窗口,这里取第一个30分钟窗口示例
      freeSlots.push({
        start: prevEnd,
        end: new Date(prevEnd.getTime() + requiredFreeMs)
      });
    }
    prevEnd = new Date(busy.end);
  }
  // 处理最后一个忙碌事件到查询结束的间隙
  const finalGapDuration = queryEnd.getTime() - prevEnd.getTime();
  if (finalGapDuration >= requiredFreeMs) {
    freeSlots.push({
      start: prevEnd,
      end: new Date(prevEnd.getTime() + requiredFreeMs)
    });
  }
}

console.log("找到的30分钟空闲窗口:", freeSlots);

为什么这个方法更好?

  • 减少API调用次数:暴力查询可能需要几十次请求,现在只需要1次,避免触发API频率限制,也提升了响应速度。
  • 逻辑更清晰:通过时间区间的对比计算空闲窗口,比循环试错更符合时间调度的逻辑。
  • 扩展性强:如果以后需要找更长或更短的空闲窗口,只需要修改requiredFreeMinutes参数即可,不用改核心逻辑。

内容的提问来源于stack exchange,提问作者sweglord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:55:25