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

如何用JavaScript获取指定年份第一周的第一天?

计算指定年份第一周第一天及周数的实现

规则回顾

  • 第1周定义:新年中至少包含4天的第一周(一周以周一为起始日)
  • 53周判定:新年第一天为周四,或闰年且新年第一天为周三

完整实现代码

// 判断是否为闰年
function isLeap(year) {
  return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
}

// 格式化日期为 dd/mm/yyyy
function formatDate(date) {
  const day = String(date.getDate()).padStart(2, '0');
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const year = date.getFullYear();
  return `${day}/${month}/${year}`;
}

// 获取指定年份第一周第一天及周数
function getYearWeekInfo(year) {
  const jan1 = new Date(year, 0, 1);
  const weekDay = jan1.getDay(); // 0=周日, 1=周一, ..., 6=周六

  // 计算第一周第一天
  let firstWeekStart;
  const daysInYearForFirstWeek = weekDay === 0 ? 1 : 8 - weekDay;
  
  if (daysInYearForFirstWeek >= 4) {
    // 包含1月1日的周符合要求,取该周的周一
    firstWeekStart = new Date(jan1);
    firstWeekStart.setDate(jan1.getDate() - (weekDay - 1));
  } else {
    // 下一个周一才是第一周的起始日
    const daysToAdd = (1 - weekDay + 7) % 7;
    firstWeekStart = new Date(jan1);
    firstWeekStart.setDate(jan1.getDate() + daysToAdd);
  }

  // 计算年份的周数(修正你原代码的判断逻辑)
  let numOfWeeks = 52;
  const leapYear = isLeap(year);
  if ((leapYear && weekDay === 3) || weekDay === 4) {
    numOfWeeks = 53;
  }

  return {
    firstWeekStart: formatDate(firstWeekStart),
    numOfWeeks: numOfWeeks
  };
}

// 测试示例
console.log(getYearWeekInfo(2020)); // 闰年,1月1日周三 → { firstWeekStart: '30/12/2019', numOfWeeks: 53 }
console.log(getYearWeekInfo(2021)); // 1月1日周五 → { firstWeekStart: '04/01/2021', numOfWeeks: 52 }
console.log(getYearWeekInfo(2022)); // 1月1日周六 → { firstWeekStart: '03/01/2022', numOfWeeks: 52 }
console.log(getYearWeekInfo(2023)); // 1月1日周日 → { firstWeekStart: '02/01/2023', numOfWeeks: 52 }
console.log(getYearWeekInfo(2024)); // 闰年,1月1日周一 → { firstWeekStart: '01/01/2024', numOfWeeks: 52 }
console.log(getYearWeekInfo(2025)); // 1月1日周三 → { firstWeekStart: '30/12/2024', numOfWeeks: 52 }
console.log(getYearWeekInfo(2026)); // 1月1日周三(非闰年)→ { firstWeekStart: '29/12/2025', numOfWeeks: 52 }

代码说明

  1. 闰年判断:标准的闰年判定逻辑,用于后续53周的判断。
  2. 日期格式化:将Date对象转换为你需要的dd/mm/yyyy格式,自动补零确保两位数字。
  3. 第一周第一天计算:
    • 先计算1月1日所在周在目标年份的天数,若≥4天,则该周的周一就是第一周起始日;
    • 若不足4天,则取1月1日之后的第一个周一作为第一周起始日。
  4. 周数修正:替换你原代码中的字符串判断,直接通过1月1日的星期数结合闰年状态判定是否为53周。

关于示例的说明

你提供的2020年、2025年示例日期存在笔误(应为上一年的12月),上述代码的输出符合规则逻辑。

内容的提问来源于stack exchange,提问作者Nivyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:15:47