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

如何使用JavaScript获取指定月份按周划分的日期范围

如何使用JavaScript获取指定月份按周维度划分的日期范围

实现思路

先对齐示例规则:每周以周日为起始、周六为结束,划分结果按WeekX - 起始日期 to 结束日期的格式输出,日期格式为dd-mm-yyyy,实现步骤如下:

  • 先锚定目标月份的时间边界:生成当月第一天、当月最后一天的Date对象,注意JS原生Date的月份参数为0索引(即1月对应0、12月对应11),处理入参时要做偏移。
  • 定位首个周起始日:计算当月第一天是星期几,找到当月第一个周日作为第一周的起始点,和示例规则对齐。如果需要调整周起始为周一,修改对应偏移计算逻辑即可。
  • 循环切分周段:从首个周起始日开始,每一周的结束日为起始日加6天(周日到周六间隔6天),每记录完一段就把起始日往后推7天,直到起始日超出当月最后一天为止。如果某段的结束日超出当月最后一天,可按需截断到当月最后一天,示例中2022年7月31日为单独的周日,未列入示例输出,可根据业务规则决定是否保留不足7天的尾段。
  • 日期格式化:处理月、日的补零逻辑,保证输出为两位数字,对齐要求的日期格式。

实现代码

function getMonthWeekRanges(year, month) {
  // 补零工具
  const padZero = (num) => String(num).padStart(2, '0');
  // 格式化日期为dd-mm-yyyy
  const formatDate = (date) => {
    const day = padZero(date.getDate());
    const m = padZero(date.getMonth() + 1);
    return `${day}-${m}-${date.getFullYear()}`;
  };

  // 当月起止边界,入参month为自然月(1-12)
  const firstDayOfMonth = new Date(year, month - 1, 1);
  const lastDayOfMonth = new Date(year, month, 0);
  const weeks = [];

  // 计算当月第一个周日(周起始,getDay()返回0代表周日)
  const firstDayWeekday = firstDayOfMonth.getDay();
  let currentWeekStart = new Date(firstDayOfMonth);
  currentWeekStart.setDate(firstDayOfMonth.getDate() + ((7 - firstDayWeekday) % 7));

  let weekIndex = 1;
  // 循环生成周段,对齐示例规则:只保留整段7天、完全落在当月的周
  while (currentWeekStart <= lastDayOfMonth) {
    const currentWeekEnd = new Date(currentWeekStart);
    currentWeekEnd.setDate(currentWeekStart.getDate() + 6);
    // 如果需要包含月末不足7天的段,放开下面这行截断逻辑即可
    // if (currentWeekEnd > lastDayOfMonth) currentWeekEnd = new Date(lastDayOfMonth);
    
    // 对齐示例:跳过跨到下月的周段
    if (currentWeekEnd.getMonth() === firstDayOfMonth.getMonth()) {
      weeks.push(`Week${weekIndex} - ${formatDate(currentWeekStart)} to ${formatDate(currentWeekEnd)}`);
      weekIndex++;
    }
    // 切到下一周
    currentWeekStart.setDate(currentWeekStart.getDate() + 7);
  }

  return weeks;
}

// 测试2022年7月
console.log(getMonthWeekRanges(2022, 7));
/* 输出结果和示例完全一致:
[
  'Week1 - 03-07-2022 to 09-07-2022',
  'Week2 - 10-07-2022 to 16-07-2022',
  'Week3 - 17-07-2022 to 23-07-2022',
  'Week4 - 24-07-2022 to 30-07-2022'
]
*/

规则调整说明

如果业务周规则是周一为周起始,只需要修改首个周起始日的计算逻辑:把((7 - firstDayWeekday) % 7)调整为((8 - firstDayWeekday) % 7)即可(因为getDay()返回1代表周一);如果需要包含月初不足一周的段、月末不足一周的段,只需要调整循环的起始点和结束截断逻辑,不需要改动整体遍历框架。


内容的提问来源于stack exchange,提问作者Durairaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:45:30