JavaScript获取当前周日期偶现返回下周数据问题排查
问题根因
代码出现偏移、偶发返回错误日期,是三个逻辑漏洞共同导致的:
- 周起始计算逻辑不兼容周日场景:
getDay()返回值范围是0(周日)到6(周六),原代码循环变量i从1起步,默认以周一为一周第一天,但遇到周日时getDay()=0,代入计算式curr.getDate() - curr.getDay() + i得到的日期直接是次日周一,比如2022年6月12日是周日,计算出的第一个日期就是13号,和预期完全不符。 - 时区偏移问题:
toISOString()输出的是UTC零时区标准时间,如果你处于东八区等UTC正偏移时区,本地时间凌晨时段,UTC时间还停留在前一天,会随机出现日期差1天的异常,这也是问题偶发的核心原因。 - 循环逻辑耦合风险:循环内直接调用
setDate()修改原始curr日期对象,每次计算下一天都是基于已经修改过的日期做运算,跨月、跨年场景下很容易出现计算偏差。
修正代码
如果你的业务规则是周一为一周起始,周日为一周结束,直接用下面的代码即可,已覆盖所有边界场景:
const curr = new Date(); // 重置时分秒为0,避免时间部分干扰日期计算 curr.setHours(0, 0, 0, 0); const week = []; // 周日的getDay返回0,转换为7,对齐周一为1的周计数规则 const dayOfWeek = curr.getDay() || 7; // 先算出本周一的基准日期 const weekStart = new Date(curr); weekStart.setDate(curr.getDate() - dayOfWeek + 1); for (let i = 0; i < 7; i++) { const targetDate = new Date(weekStart); targetDate.setDate(weekStart.getDate() + i); // 用本地时间拼接日期字符串,规避UTC时区偏移问题 const year = targetDate.getFullYear(); const month = String(targetDate.getMonth() + 1).padStart(2, '0'); const day = String(targetDate.getDate()).padStart(2, '0'); week.push(`${year}-${month}-${day}`); } console.log(week);
适配说明
- 如果需要以周日为一周起始,只需要修改周基准日期计算逻辑:
const weekStart = new Date(curr); weekStart.setDate(curr.getDate() - curr.getDay()),其余逻辑不变即可。 - 修正后的代码每次循环都基于固定的周起始日期做偏移计算,不会修改原始基准值,跨月、跨年、夏令时切换场景下都不会出现计算错误。
- 本地时间格式化逻辑完全替代
toISOString(),不会再因为时区差出现随机的日期偏移问题。
内容的提问来源于stack exchange,提问作者Zia Yamin
相关产品推荐
相关产品推荐

