JavaScript拆分固定天数日期区间时结束日期计算异常如何解决
错误原因
代码的异常来自两个核心逻辑漏洞:
- 全局只初始化了一次
stopDate对象,所有循环轮次都在修改同一个Date实例的时间值,没有基于每一轮的起始日期独立生成结束时间对象 getDate()方法返回的是Date实例所在月份的日序号(取值1-31),不是跨月的绝对时间偏移。当日期跨月时,保留了上一月份时间的stopDate调用setDate()传入较小的日序号时,会直接将日期回退到当前所在月的对应日期,就会出现结束日期早于起始日期的错乱输出。
另外原逻辑缺少边界判断:最后一个分片的结束日期可能超过预设的总查询截止日toDate,会导致API请求超出预期查询范围。
修正代码
每轮循环基于当前分片的起始日期新建独立Date实例计算结束时间,同时增加边界截断处理:
const daysBracket = 15; let fromDate = new Date('2020-04-01'); const toDate = new Date('2020-06-01'); while(fromDate <= toDate) { // 基于当前起始日期新建独立实例计算结束日,不复用全局Date对象 const stopDate = new Date(fromDate); stopDate.setDate(stopDate.getDate() + (daysBracket - 1)); // 截断最后一个分片的结束时间,不超过总截止日期 const actualStopDate = stopDate > toDate ? new Date(toDate) : stopDate; console.log('Start: ' + fromDate.toDateString()); console.log('Stop: ' + actualStopDate.toDateString()); console.log('- - - - - - - - - - - - -'); fromDate.setDate(fromDate.getDate() + daysBracket); }
运行后可以得到符合预期的分片结果:
Start: Wed Apr 01 2020 Stop: Wed Apr 15 2020 - - - - - - - - - - - - - Start: Thu Apr 16 2020 Stop: Thu Apr 30 2020 - - - - - - - - - - - - - Start: Fri May 01 2020 Stop: Fri May 15 2020 - - - - - - - - - - - - - Start: Sat May 16 2020 Stop: Sat May 30 2020 - - - - - - - - - - - - - Start: Sun May 31 2020 Stop: Mon Jun 01 2020 - - - - - - - - - - - - -
内容的提问来源于stack exchange,提问作者user3174311
相关产品推荐
相关产品推荐

