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

如何区分双周循环日程中的不同周一(Day1/6)?附JS代码

搞定每两周循环的工作日程:区分周一为Day1或Day6

嘿,我明白你的需求了——要做一个每两周循环的工作日程,而且得准确区分不同周一对应的Day值(比如5月14日周一Day6,5月21日周一Day1,5月28日周一又回到Day6)。核心确实可以用模运算,但关键得先算对目标日期和基准日期之间的工作日差值,毕竟你不计入周末嘛。

我来给你拆解下思路,再附上调整后的代码:

核心思路

  1. 定一个基准日期:比如你提到的5月21日周一(Day1),所有日期的Day值都基于这个基准来计算。
  2. 算工作日差值:统计目标日期和基准日期之间有多少个工作日(排除周六周日)。
  3. 模循环周期:两周共有10个工作日,所以用差值对10取模,就能得到目标日期在循环中的位置,再映射到对应的Day值。

完整代码实现

JavaScript 部分

// 基准日期:2018年5月21日周一,对应Day1(你可以根据自己的需求调整这个基准)
const baseDay1Date = new Date(2018, 4, 21); // 注意JS里月份是0-based,4代表5月
const targetDate = new Date(); // 当前日期,也可以换成指定日期比如new Date(2018,4,14)

// 计算两个日期之间的工作日天数差(排除周末)
function calculateWeekdayDifference(start, end) {
    let diffCount = 0;
    let current = new Date(start);
    
    while (current <= end) {
        const dayOfWeek = current.getDay();
        // 跳过周六(6)和周日(0)
        if (dayOfWeek !== 0 && dayOfWeek !== 6) {
            diffCount++;
        }
        current.setDate(current.getDate() + 1);
    }
    // 如果目标日期在基准之前,返回负数差值
    return end >= start ? diffCount : -diffCount;
}

// 根据工作日差值计算循环中的Day值
function getCycleDay(target, base, cycleWorkdays = 10) {
    const diff = calculateWeekdayDifference(base, target);
    // 处理负数情况,确保模运算结果始终为正
    const normalizedMod = ((diff % cycleWorkdays) + cycleWorkdays) % cycleWorkdays;
    // 基准是Day1,所以mod=0对应Day1,mod=5对应Day6,以此类推
    return normalizedMod === 0 ? 1 : normalizedMod;
}

// 更新页面显示
const dayNumberElement = document.getElementById("dayNumber");
const currentCycleDay = getCycleDay(targetDate, baseDay1Date);
dayNumberElement.textContent = `Today is Day ${currentCycleDay}`;

// 测试你的例子:
const testMay14 = new Date(2018, 4, 14);
console.log(`2018-05-14 is Day ${getCycleDay(testMay14, baseDay1Date)}`); // 输出Day6

const testMay28 = new Date(2018, 4, 28);
console.log(`2018-05-28 is Day ${getCycleDay(testMay28, baseDay1Date)}`); // 输出Day6

HTML 部分

<p id="dayNumber"></p>

关键逻辑说明

  • 工作日差值计算:calculateWeekdayDifference会逐天遍历,只统计工作日,确保差值准确,不会把周末算进去。
  • 模运算处理:用((diff % cycleWorkdays) + cycleWorkdays) % cycleWorkdays是为了避免出现负数的模结果,比如当目标日期在基准日期之前时(比如5月14日比5月21日早),差值是-5,模10后会变成5,正好对应Day6。
  • Day值映射:因为我们把5月21日设为Day1,所以差值为0时是Day1,差值为5时是Day6,完美匹配你给出的例子。

自定义小技巧

如果你想把基准换成5月14日(Day6),只需要调整baseDay1Date为new Date(2018,4,14),然后修改getCycleDay里的映射逻辑:比如return normalizedMod === 0 ? 6 : (normalizedMod + 5) % 10 || 10;——这样差值为0时是Day6,差值为5时是Day1,同样能实现你的循环需求。

内容的提问来源于stack exchange,提问作者DarkRunner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:33:32