JS根据周数与年份获取一周首日的正确方法?现有代码问题求助
如何根据周数和年份正确获取目标周的首日与末日
你的问题核心是没有遵循ISO 8601的周规则——ISO周以周一为一周起始日,且当年的第1周必须包含至少4天(或者说包含当年的第一个周四)。你的现有代码直接从1月1日累加周数,自然会和实际需求产生偏差。
问题拆解
- 2017年1月1日是周日,按照ISO规则,这一天属于2016年的第52周,所以2017年第1周的首日是1月2日(周一)。
- 2016年是闰年,当年的第53周从12月26日(周一)开始,这一周包含2016年的最后5天,符合ISO第53周的定义(当年有53周的情况是:当年12月29日为周一,或是闰年且12月30日为周一)。
修正后的代码
下面是完全遵循ISO周规则的实现,每一步逻辑都有注释说明:
function getDateOfWeek(week, year) { // 创建当年1月4日的日期(ISO第1周必定包含这一天) const startOfYear = new Date(year, 0, 4); // 获取1月4日的星期值(0=周日,1=周一...6=周六) const dayOfWeek = startOfYear.getDay(); // 计算当年第1周的周一:1月4日减去它与周一的天数差 // 特殊处理周日:getDay()返回0时,要减去6天才能到周一 const firstMonday = new Date(startOfYear); firstMonday.setDate(startOfYear.getDate() - (dayOfWeek === 0 ? 6 : dayOfWeek - 1)); // 计算目标周的周一:第1周周一加上 (week-1)*7 天 const targetMonday = new Date(firstMonday); targetMonday.setDate(firstMonday.getDate() + (week - 1) * 7); // 计算目标周的周日(一周的末日) const targetSunday = new Date(targetMonday); targetSunday.setDate(targetMonday.getDate() + 6); return { dateFrom: targetMonday, dateTo: targetSunday }; }
测试验证
- 调用
getDateOfWeek(1, 2017):返回dateFrom为Mon Jan 02 2017,dateTo为Sun Jan 08 2017,完全符合你的需求。 - 调用
getDateOfWeek(53, 2016):返回dateFrom为Mon Dec 26 2016,dateTo为Sun Jan 01 2017,和你的预期完全匹配。
额外说明
如果你的需求是其他周规则(比如以周日为一周起始),只需要调整计算首日的逻辑即可,但从你的例子来看,你需要的是ISO标准的周规则。
内容的提问来源于stack exchange,提问作者Daria
相关产品推荐
相关产品推荐

