如何获取两个日期之间所有日历周的数组?支持原生JS或Moment.js
生成起止日期间的所有日历周数组
原生JavaScript实现
核心逻辑是逐周遍历日期范围,计算每个日期对应的ISO周数和年份,用Set去重后转为有序数组。以下是完整实现:
// 计算日期对应的ISO周数和年份(周一为一周起始,第一周含当年第一个周四) function getISOWeekYear(date) { const utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); const dayOfWeek = utcDate.getUTCDay() || 7; // 将周日转为7,便于计算 utcDate.setUTCDate(utcDate.getUTCDate() + 4 - dayOfWeek); // 定位到本周周四,确保年份正确 const year = utcDate.getUTCFullYear(); const weekNum = Math.ceil((((utcDate - new Date(Date.UTC(year, 0, 1))) / 86400000) + 1) / 7); return { week: weekNum, year: year }; } // 生成周数组,输入日期格式为MM/DD/YY function generateWeekArray(startDateStr, endDateStr) { // 解析日期字符串为Date对象 const parseDate = (str) => { const [month, day, year] = str.split('/').map(num => parseInt(num)); return new Date(2000 + year, month - 1, day); }; const start = parseDate(startDateStr); const end = parseDate(endDateStr); const uniqueWeeks = new Set(); let currentDate = new Date(start); while (currentDate <= end) { const { week, year } = getISOWeekYear(currentDate); // 格式化周数为两位,年份取后两位(如需四位年份,改为`${week.toString().padStart(2, '0')}/${year}`) const weekStr = `${week.toString().padStart(2, '0')}/${year.toString().slice(-2)}`; uniqueWeeks.add(weekStr); // 推进到下一周 currentDate.setDate(currentDate.getDate() + 7); } // 转为有序数组返回 return Array.from(uniqueWeeks).sort(); } // 示例调用 const weeks = generateWeekArray('12/02/22', '01/28/23'); console.log(weeks); // 输出:["48/22", "49/22", "50/22", "51/22", "52/22", "01/23", "02/23", "03/23", "04/23"]
Moment.js实现
借助Moment.js的isoWeek()和isoWeekYear()方法可以简化周数计算,无需自己实现周规则:
// 需先引入Moment.js库 function generateWeekArrayWithMoment(startDateStr, endDateStr) { const start = moment(startDateStr, 'MM/DD/YY'); const end = moment(endDateStr, 'MM/DD/YY'); const uniqueWeeks = new Set(); let current = moment(start); while (current.isSameOrBefore(end)) { const week = current.isoWeek(); const year = current.isoWeekYear(); // 格式化规则和原生方案一致 const weekStr = `${week.toString().padStart(2, '0')}/${year.toString().slice(-2)}`; uniqueWeeks.add(weekStr); current.add(1, 'week'); } return Array.from(uniqueWeeks).sort(); } // 示例调用 const weeks = generateWeekArrayWithMoment('12/02/22', '01/28/23'); console.log(weeks); // 输出与原生方案一致
注意事项
- 日期格式:如果输入日期不是
MM/DD/YY,需要修改解析逻辑(原生JS的parseDate函数、Moment的日期格式参数)。 - 周规则:上述实现采用ISO周规则,若需要以周日为一周起始,需调整周数计算逻辑。
- 年份格式:示例输出混合了两位和四位年份,可根据需求修改代码中的年份格式化部分。
内容的提问来源于stack exchange,提问作者femorom424
相关产品推荐
相关产品推荐

