如何使用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
相关产品推荐
相关产品推荐

