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

计算周起止日期遇新月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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:39:04