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

如何获取两个日期之间所有日历周的数组?支持原生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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:25:27