有最大offset限制的日期范围API如何拆分查询子范围获取全量数据?
递归拆分日期区间实现方案
核心思路
- 前置判断逻辑:对任意日期区间,先请求
offset=1000&limit=20的接口,通过返回结果条数判断区间数据量是否超过可拉取上限(1020条) - 递归终止条件:
- 请求返回结果条数 < 20,说明当前区间数据总量≤1020,可通过正常翻页拉取全量数据,无需继续拆分
- 日期区间已经拆分到最小粒度(默认按天拆分,可根据业务调整为小时/分钟),无法继续拆分
- 拆分规则:将当前日期区间按时间二等分,两个子区间首尾重叠,避免中间时间点的数据遗漏
JavaScript 实现代码
首先封装基础工具函数:
// 日期格式化:转成 YYYY-MM-DD 格式 function formatDate(date) { const year = date.getFullYear() const month = String(date.getMonth() + 1).padStart(2, '0') const day = String(date.getDate()).padStart(2, '0') return `${year}-${month}-${day}` } // 计算两个日期相差的天数 function getDayDiff(from, to) { const fromTime = new Date(from).getTime() const toTime = new Date(to).getTime() return Math.ceil((toTime - fromTime) / (1000 * 60 * 60 * 24)) } // 获取中间日期 function getMiddleDate(from, to) { const fromTime = new Date(from).getTime() const toTime = new Date(to).getTime() const middleTime = fromTime + Math.floor((toTime - fromTime) / 2) return formatDate(new Date(middleTime)) } // 封装API请求,返回offset=1000&limit=20的结果条数 async function fetchResultCount(from, to) { const url = `https://api.com/?from=${from}&to=${to}&limit=20&offset=1000` const res = await fetch(url) const data = await res.json() // 假设接口返回的结果数组放在data.list里,根据实际接口结构调整 return data.list.length }
核心递归拆分函数:
async function splitDateInterval(from, to) { const result = [] // 边界校验:起始日期大于结束日期直接返回空 if (new Date(from) > new Date(to)) return result // 第一步:判断当前区间是否需要拆分 const count = await fetchResultCount(from, to) // 无需拆分,直接加入结果 if (count < 20) { result.push([from, to]) return result } // 已经是最小粒度(间隔1天),无法继续拆分,直接加入结果 const dayDiff = getDayDiff(from, to) if (dayDiff <= 1) { result.push([from, to]) return result } // 第二步:拆分区间为两等份,递归处理 const middleDate = getMiddleDate(from, to) // 左区间:from 到 中间日期 const leftRes = await splitDateInterval(from, middleDate) // 右区间:中间日期 到 to,首尾重叠避免数据遗漏 const rightRes = await splitDateInterval(middleDate, to) // 合并结果返回 return [...leftRes, ...rightRes] }
使用示例
// 调用示例 splitDateInterval('2021-07-20', '2021-07-24').then(res => { console.log(res) // 输出格式示例:[["2021-07-20","2021-07-22"],["2021-07-22","2021-07-24"]],如果每个子区间数据还是超量会继续拆分到符合要求 })
优化建议
- 可根据业务需求调整最小拆分粒度,比如数据量极大的场景可以拆分为小时级
- 可以添加请求缓存,避免同一个区间重复请求接口
- 递归深度过大时可以改写成迭代实现,避免栈溢出
内容的提问来源于stack exchange,提问作者Rod0n
相关产品推荐
相关产品推荐

