如何用纯JavaScript计算两个HTML week选择器的周期间隔周数
实现方案
核心思路
通过自定义工具函数获取任意年份的ISO总周数,分场景计算间隔:
- 起止周属于同一年:直接用结束周减去开始周即可
- 起止周跨年:累加「开始年剩余周数 + 中间所有完整年份总周数 + 结束年已过周数」得到最终间隔
完整代码
// 工具函数:获取指定日期对应的ISO周数 function getISOWeek(date) { const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); const dayOfWeek = d.getUTCDay() || 7; d.setUTCDate(d.getUTCDate() + 4 - dayOfWeek); const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); return Math.ceil((((d - yearStart) / 86400000) + 1) / 7); } // 工具函数:获取指定年份的ISO总周数 function getISOWeeksInYear(year) { // ISO周规则:每年12月28日所在的周就是当年最后一周,其周数即为当年总周数 return getISOWeek(new Date(year, 11, 28)); } // 计算两个周字符串的间隔周数 function calcWeekInterval(weekStr1, weekStr2) { // 解析形如"2021-W01"的字符串为年、周数值 const parseWeek = (str) => { const [year, weekPart] = str.split('-'); return { year: Number(year), week: Number(weekPart.replace('W', '')) }; }; let start = parseWeek(weekStr1); let end = parseWeek(weekStr2); // 统一时间顺序,保证start早于end if (start.year > end.year || (start.year === end.year && start.week > end.week)) { [start, end] = [end, start]; } let interval = 0; if (start.year === end.year) { interval = end.week - start.week; } else { // 累加开始年剩余周数 interval += getISOWeeksInYear(start.year) - start.week; // 累加中间完整年份的所有周数 for (let year = start.year + 1; year < end.year; year++) { interval += getISOWeeksInYear(year); } // 累加结束年的周数 interval += end.week; } return interval; } // 调用示例 const picker1 = document.getElementById('weekPicker1'); const picker2 = document.getElementById('weekPicker2'); const weekInterval = calcWeekInterval(picker1.value, picker2.value); console.log(weekInterval); // 示例输入2021-W01、2021-W52返回52
说明
该实现完全遵循ISO 8601周数规则,无第三方依赖,不会出现按天数计算的偏差,可直接用于后续的比例计算逻辑。
内容的提问来源于stack exchange,提问作者Allart
相关产品推荐
相关产品推荐

