如何区分双周循环日程中的不同周一(Day1/6)?附JS代码
搞定每两周循环的工作日程:区分周一为Day1或Day6
嘿,我明白你的需求了——要做一个每两周循环的工作日程,而且得准确区分不同周一对应的Day值(比如5月14日周一Day6,5月21日周一Day1,5月28日周一又回到Day6)。核心确实可以用模运算,但关键得先算对目标日期和基准日期之间的工作日差值,毕竟你不计入周末嘛。
我来给你拆解下思路,再附上调整后的代码:
核心思路
- 定一个基准日期:比如你提到的5月21日周一(Day1),所有日期的Day值都基于这个基准来计算。
- 算工作日差值:统计目标日期和基准日期之间有多少个工作日(排除周六周日)。
- 模循环周期:两周共有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
相关产品推荐
相关产品推荐

