计算周起止日期遇新月1号返回异常结果的技术求助
问题原因
- Date对象的
setDate方法是原地修改:你所有操作都修改了同一个dateNow实例,计算周第一天后,dateNow的月份/年份已经发生变化,后续计算周结束日期时基准已经不是原始输入日期,自然出错。
以2021年9月1日的场景为例:原始dateNow是2021-09-01,当天是周三,getDay()返回3,计算得到first = 1 - 3 + 1 = -1,调用dateNow.setDate(-1)后,dateNow被改为2021-08-30。后续你用first+6=5作为last参数,调用dateNow.setDate(5)时,当前dateNow的月份已经是8月,就会直接设置为2021-08-05,这就是你得到错误结果的直接原因。 - 拼接结果时误用了被修改的
dateNow:你最后拼接ID时用的是dateNow.getFullYear(),此时dateNow已经被改为周结束日期,要是遇到跨年周,年份也会出现错误。 - 原周起始计算逻辑对周日的处理有隐患:
getDay()返回值范围是0(周日)到6(周六),你当前的计算逻辑遇到周日时,会把周日归到下一周,不符合瑞典周一为周首的规则。
修复后代码
function currentWeeklyId(inputDate = new Date()) { // 复制原始日期,避免修改原对象 const dateNow = new Date(inputDate); const dayOfWeek = dateNow.getDay(); // 适配周一为周首:周日(0)需要减6天,其他日期减 (dayOfWeek - 1) 天 const offsetToMonday = dayOfWeek === 0 ? -6 : 1 - dayOfWeek; // 计算周第一天 const fDay = new Date(dateNow); fDay.setDate(dateNow.getDate() + offsetToMonday); // 计算周最后一天:周第一天加6天 const lDay = new Date(fDay); lDay.setDate(fDay.getDate() + 6); // 格式化月份和日期,补前导零 const formatTwoDigits = num => num < 10 ? `0${num}` : num; const firstYear = fDay.getFullYear(); const firstMonth = formatTwoDigits(fDay.getMonth() + 1); const firstDay = formatTwoDigits(fDay.getDate()); const lastYear = lDay.getFullYear(); const lastMonth = formatTwoDigits(lDay.getMonth() + 1); const lastDay = formatTwoDigits(lDay.getDate()); return `${firstYear}${firstMonth}${firstDay}-${lastYear}${lastMonth}${lastDay}`; }
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

