如何用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 }
代码说明
- 闰年判断:标准的闰年判定逻辑,用于后续53周的判断。
- 日期格式化:将Date对象转换为你需要的
dd/mm/yyyy格式,自动补零确保两位数字。 - 第一周第一天计算:
- 先计算1月1日所在周在目标年份的天数,若≥4天,则该周的周一就是第一周起始日;
- 若不足4天,则取1月1日之后的第一个周一作为第一周起始日。
- 周数修正:替换你原代码中的字符串判断,直接通过1月1日的星期数结合闰年状态判定是否为53周。
关于示例的说明
你提供的2020年、2025年示例日期存在笔误(应为上一年的12月),上述代码的输出符合规则逻辑。
内容的提问来源于stack exchange,提问作者Nivyan
相关产品推荐
相关产品推荐

