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

如何用纯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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:15:02