所以,我有一个个人项目,我正在尝试为学习目的做更多事情。这将是两个计时器来监视一周内的两个不同事件,其中一个计时器会倒计时正在发生的事件的剩余时间(距离事件结束还有多少天/小时),另一个计时器会倒计时直到下一个事件开始的剩余时间。然后当它标记为 0 时它们会切换(当前的会变成下一个,反之亦然)。
示例:活动 A 将于周五晚上 8 点开始,周一下午 2 点结束,活动 B 将于周二下午 6 点至晚上 7 点结束。定时器 1(当前事件)将计算事件 A 的持续时间,并显示剩余时间的倒计时,直到以天和/或小时为单位到达结束,而定时器 2(下一个事件)将执行相同的操作,但倒计时以显示如何直到事件 B 开始,格式相同 (dd/hh:min:s)。事件 A 结束时,计时器 1 应冻结在 00 00:00 并保持不变,而时间 2 直到结束,只有那时事件才会切换 ID,因此事件 B 现在是当前事件,事件 A 是下一个事件(它们每周一次并且无限循环)。
我现在的主要困难是弄清楚如何将计时器设置为在给定工作日开始和结束,并在特定时间而不是静态日期,因为事件已经固定在工作日发生。
我查找了
Date()
方法,但不知道如何使用它,因为它请求特定日期作为参数。
我希望代码尽可能简单,但任何提示、建议、忠告或可能的解决方案都非常受欢迎,即使它们涉及更高级的方法。 JavaScript 不是我的强项,但我认为我可以自己完成循环和所有其他事情 - 只需要弄清楚这一点即可启动。
在以下函数中,第一个参数
dow
为 0 = 星期日到 6 = 星期六
如果我理解这个逻辑,目前(即周六)周一“结束”是在两天左右,所以周五开始是昨天(如果你仍然在周五晚上 8 点之前在你的地区,逻辑仍然虽然有效)
我看到的逻辑是,找到即将到来的周一下午 2 点,计算上周五晚上 8 点(无论是未来还是过去,只要是在即将到来的周一下午 2 点之前)
同样,找到下周二晚上 7 点,然后找到与之相关的前一个下午 6 点
一旦你有了这 4 个日期,我想你已经有逻辑知道要显示什么了
const nextDateDow = (dow, hours = 0, minutes = 0, seconds = 0, milliseconds = 0) => {
const now = Date.now();
const target = new Date(now);
target.setDate(target.getDate() + dow - target.getDay());
target.setHours(hours, minutes, seconds, milliseconds);
if (target < now) {
target.setDate(target.getDate() + 7);
}
target.setHours(hours, minutes, seconds, milliseconds); // account for DST
return target;
};
const prevDateDow = (dow, before = Date.now(), hours = 0, minutes = 0, seconds = 0, milliseconds = 0) => {
const target = nextDateDow(dow, hours, minutes, seconds, milliseconds);
while (target > before) {
target.setDate(target.getDate() - 7);
}
target.setHours(hours, minutes, seconds, milliseconds); // account for DST
return target;
};
const monday = nextDateDow(1, 14);
const friday = prevDateDow(5, monday, 20);
const tuesdayEnd = nextDateDow(2, 19);
const tuesdayStart = prevDateDow(2, tuesdayEnd, 18);
console.log(friday.toString())
console.log(monday.toString())
console.log(tuesdayStart.toString())
console.log(tuesdayEnd.toString());
注意:如果 DST 在当前日期和目标日期之间开始/结束,上述代码不应中断,因为您感兴趣的日子(星期一、星期二、星期五)通常不是 DST 开始或结束的日子,即使在某个地方这种情况确实会发生,通常发生在凌晨,所以下午 2 点、下午 6 点、晚上 7 点和晚上 8 点也不太可能导致问题。