Chrome扩展中Google Calendar 30分钟空闲时段高效查询方案
高效查找Google Calendar中30分钟空闲时段的方案
不用每次递增5分钟暴力查询,最优方案是一次性获取目标时间范围内的所有忙碌事件,再从时间间隙中筛选出30分钟的空闲窗口,只需要调用一次Google Calendar FreeBusy API,效率和优雅度都能拉满。
具体步骤:
- 批量获取目标时间范围的忙碌数据
先确定你要查询的整体时间范围(比如今天全天、未来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 || [];
- 从时间间隙中筛选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
相关产品推荐
相关产品推荐

