如果在所需的一周内未找到,则获取下一个工作日

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 的整数。

Day0 to 6 的整数,表示从 sunsat 的工作日。

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 中,您需要调用一个函数,它将找到 Tuesdaynext 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. 编码愉快:)