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

如何从指定日期范围提取周数据?附未完成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:18:46