如何从指定日期范围提取周数据?附未完成WeekByDates函数代码
完善基于日期范围提取周数据的WeekByDates()函数
我来帮你完善这个WeekByDates()函数,实现从指定日期范围里提取完整的周数据(默认采用ISO标准的周一到周日为一周,也可以轻松调整为周日开头的规则)。结合你给出的未完成代码,我把逻辑补全并优化了细节:
function WeekByDates(dates) { // 解析传入的起始、结束日期并格式化 let stDate = moment(dates[0].value).format('YYYY-MM-DD'); let eDate = moment(dates[1].value).format('YYYY-MM-DD'); let startDate = moment(stDate); let endDate = moment(eDate); let weekData = []; while (startDate.isSameOrBefore(endDate)) { // 获取当前周的起始日期(ISO标准:周一为周起始) let weekStart = startDate.clone().startOf('isoWeek'); // 获取当前周的结束日期(ISO标准:周日为周结束) let weekEnd = startDate.clone().endOf('isoWeek'); // 处理边界情况:如果当前周的结束日期超出了总范围,就用总结束日期替代 if (weekEnd.isAfter(endDate)) { weekEnd = endDate.clone(); } // 将当前周的信息存入数组 weekData.push({ startDate: weekStart.format('YYYY-MM-DD'), endDate: weekEnd.format('YYYY-MM-DD'), // 可选:添加周数字段,方便后续标识 weekNumber: weekStart.format('ww') }); // 将起始日期推进到下一周的第一天,继续循环 startDate = weekEnd.clone().add(1, 'day'); } return weekData; }
关键细节说明:
- 周规则调整:如果习惯以周日作为一周的开始,只需要把
startOf('isoWeek')改成startOf('week'),endOf('isoWeek')改成endOf('week')即可。 - 边界周处理:避免最后一周的结束日期超出用户指定的总范围,确保返回的周数据完全贴合输入的日期区间。
- 循环推进逻辑:每次循环后把起始日期移到当前周结束的次日,保证下一次循环处理的是下一周的日期,不会重复或遗漏。
示例效果:
当你传入的日期是2018-06-01到2018-06-14时,调用函数会返回:
[ { startDate: '2018-05-28', endDate: '2018-06-03', weekNumber: '22' }, { startDate: '2018-06-04', endDate: '2018-06-10', weekNumber: '23' }, { startDate: '2018-06-11', endDate: '2018-06-14', weekNumber: '24' } ]
内容的提问来源于stack exchange,提问作者Arun K
相关产品推荐
相关产品推荐

