如果在所需的一周内未找到,则获取下一个工作日
Get next occurrence of a weekday if not found in desired week
如果在所需的一周内找不到下一个工作日,我如何才能想出一个算法来找出下一个工作日。例如下面是日历的屏幕截图。 April
第一周没有Tuesday
。我需要一个想法,如果没有出现在给定的一周内,我该如何参加下周的下一个 Tuesday
?
下面是我的算法,它可以很好地获取任何一周的选定工作日。我只想在其中添加两个条件,以便在给定周内不存在工作日的情况下来回迭代。
for(var ind=0; ind<=between.length; ind++){
if (new Date(between[ind]).getMonthWeek() === baseDtWk && new Date(between[ind]).getDay() === baseDtD) {
datesToBeMarked.push(between[ind]);
console.log(" :Date: " + between[ind] + " :Week: " + new Date(between[ind]).getMonthWeek());
console.log("Date entered : " + new Date(between[ind]));
}
}
在上面的代码中 baseDtWk
& baseDtD
包含周和日。
Week 是来自 1 to 5
的整数。
Day 是 0 to 6
的整数,表示从 sun
到 sat
的工作日。
for-loop
遍历所有数组元素并将元素推入另一个数组,该数组在一个月内具有相同的星期和工作日。所以理想情况下,它是在快乐的场景中实现目的,在这个场景中,每个工作日都有空。与上述情况不同。任何想法,指导将不胜感激。谢谢。
通过查看您的代码,您似乎已经有了结构,只需要知道如何使用它。
我将稍微修改您的 if condition
,如下所示。
for(var ind=0; ind<=between.length; ind++){
var thisDt = new Date(between[ind]);
if (thisDt.getMonthWeek() === baseDtWk && thisDt.getDay() === baseDtD) {
datesToBeMarked.push(thisDt);
console.log(" :Date: " + between[ind] + " :Week: " + thisDt.getMonthWeek());
console.log("Date entered : " + new Date(between[ind]));
}
}
只需添加一个 var thisDt = new Date(between[ind])
,您就可以获得比以前更简洁的代码。
1. 现在仔细查看您的代码,您已经在 if-condition
中按星期和工作日扫描每个日期。合格的元素进入 datesToBeMarked[]
数组。
2. 你需要引入另一个 if-condition
它将遍历 between[]
数组并扫描每个 base day
(你调用它的基础是 between[]
数组中的第一个元素)。现在 if-condition
将如下所示。
for(var ind=0; ind<=between.length; ind++){
var thisDt = new Date(between[ind]);
if (thisDt.getMonthWeek() === baseDtWk && thisDt.getDay() === baseDtD) {
datesToBeMarked.push(thisDt);
console.log(" :Date: " + between[ind] + " :Week: " + thisDt.getMonthWeek());
console.log("Date entered : " + new Date(between[ind]));
}else if(thisDt.getDay() === baseDtD && thisDt.getMonth()!==new Date(datesToBeMarked[ind-1]).getMonth()){
//some magic needs to be done here
}
}
3. else-if
上面发生了什么?它正在检查您已经选择的 Tuesday
和下一个元素。如果它在同一个月到来,那么拒绝它。不然就让它进来if-condition
里面看看神招吧。 :)
4. 最后,在您的 else-if
中,您需要调用一个函数,它将找到 Tuesday
的 next occurrence
如果它最初在第一周没有到位,如上图所示。
5. 查找日期的函数如下所示。你们都充满希望。
以下函数需要在您的 else-if
中替换为此注释 //some magic needs to be done here
.
function nthDay(nth, weekday, month, year) {
var nthDate = new Date(year, month + ((nth <= 0) ? 1 : 0), 1);
var dayofweek = nthDate.getDay();
var offset = weekday - dayofweek;
nthDate = new Date(year, month + ((nth <= 0) ? 1 : 0), nthDate.getDate() + (offset + (nth - (offset >= 0 ? 1 : 0)) * 7));
if (nthDate.getMonth() !== month) {
return false;
} else {
return nthDate;
}
}
6. 编码愉快:)
如果在所需的一周内找不到下一个工作日,我如何才能想出一个算法来找出下一个工作日。例如下面是日历的屏幕截图。 April
第一周没有Tuesday
。我需要一个想法,如果没有出现在给定的一周内,我该如何参加下周的下一个 Tuesday
?
下面是我的算法,它可以很好地获取任何一周的选定工作日。我只想在其中添加两个条件,以便在给定周内不存在工作日的情况下来回迭代。
for(var ind=0; ind<=between.length; ind++){
if (new Date(between[ind]).getMonthWeek() === baseDtWk && new Date(between[ind]).getDay() === baseDtD) {
datesToBeMarked.push(between[ind]);
console.log(" :Date: " + between[ind] + " :Week: " + new Date(between[ind]).getMonthWeek());
console.log("Date entered : " + new Date(between[ind]));
}
}
在上面的代码中 baseDtWk
& baseDtD
包含周和日。
Week 是来自 1 to 5
的整数。
Day 是 0 to 6
的整数,表示从 sun
到 sat
的工作日。
for-loop
遍历所有数组元素并将元素推入另一个数组,该数组在一个月内具有相同的星期和工作日。所以理想情况下,它是在快乐的场景中实现目的,在这个场景中,每个工作日都有空。与上述情况不同。任何想法,指导将不胜感激。谢谢。
通过查看您的代码,您似乎已经有了结构,只需要知道如何使用它。
我将稍微修改您的 if condition
,如下所示。
for(var ind=0; ind<=between.length; ind++){
var thisDt = new Date(between[ind]);
if (thisDt.getMonthWeek() === baseDtWk && thisDt.getDay() === baseDtD) {
datesToBeMarked.push(thisDt);
console.log(" :Date: " + between[ind] + " :Week: " + thisDt.getMonthWeek());
console.log("Date entered : " + new Date(between[ind]));
}
}
只需添加一个 var thisDt = new Date(between[ind])
,您就可以获得比以前更简洁的代码。
1. 现在仔细查看您的代码,您已经在 if-condition
中按星期和工作日扫描每个日期。合格的元素进入 datesToBeMarked[]
数组。
2. 你需要引入另一个 if-condition
它将遍历 between[]
数组并扫描每个 base day
(你调用它的基础是 between[]
数组中的第一个元素)。现在 if-condition
将如下所示。
for(var ind=0; ind<=between.length; ind++){
var thisDt = new Date(between[ind]);
if (thisDt.getMonthWeek() === baseDtWk && thisDt.getDay() === baseDtD) {
datesToBeMarked.push(thisDt);
console.log(" :Date: " + between[ind] + " :Week: " + thisDt.getMonthWeek());
console.log("Date entered : " + new Date(between[ind]));
}else if(thisDt.getDay() === baseDtD && thisDt.getMonth()!==new Date(datesToBeMarked[ind-1]).getMonth()){
//some magic needs to be done here
}
}
3. else-if
上面发生了什么?它正在检查您已经选择的 Tuesday
和下一个元素。如果它在同一个月到来,那么拒绝它。不然就让它进来if-condition
里面看看神招吧。 :)
4. 最后,在您的 else-if
中,您需要调用一个函数,它将找到 Tuesday
的 next occurrence
如果它最初在第一周没有到位,如上图所示。
5. 查找日期的函数如下所示。你们都充满希望。
以下函数需要在您的 else-if
中替换为此注释 //some magic needs to be done here
.
function nthDay(nth, weekday, month, year) {
var nthDate = new Date(year, month + ((nth <= 0) ? 1 : 0), 1);
var dayofweek = nthDate.getDay();
var offset = weekday - dayofweek;
nthDate = new Date(year, month + ((nth <= 0) ? 1 : 0), nthDate.getDate() + (offset + (nth - (offset >= 0 ? 1 : 0)) * 7));
if (nthDate.getMonth() !== month) {
return false;
} else {
return nthDate;
}
}
6. 编码愉快:)