减去考虑周末的天数

Subtract days considering weekends

例如,我有 4 个按日期填充的下拉列表

["23rd December 2016","26th December 2016","27th December 2016","28th December 2016", "29th December 2016"]

在这种情况下,我希望避免周末。

每个下拉菜单的值如下

- 23rd December 2016
- 26th December 2016
- 27th December 2016
- 28th December 2016

目的是,如果我将第一个日期的值从 23 日 ("A Friday") 更改为 26 日 ("A Monday"),则其他 3 个日期将一天转移到以下值;

- 26th December 2016
- 27th December 2016
- 28th December 2016
- 29th December 2016

下面的代码可以正常工作

addWeekdays: function (date, days) {
        date = moment(date); // use a clone
        while (days > 0) {
            date = date.add(1, 'days');
            // decrease "days" only if it's a weekday.
            if (date.isoWeekday() !== 6 && date.isoWeekday() !== 7) {
                days -= 1;
            }
        }
return date;
}

每个下拉框的值循环通过这个函数,date是下拉框的日期值,days是初始日期和新日期之间的天数差。

我遇到的问题是,如果我尝试从 26 号切换回 23 号,我不确定如何重新创建它,所以我得到以下信息;

- 23rd December 2016
- 26th December 2016
- 27th December 2016
- 28th December 2016

基本上这是一种减去周末天数差异的方法,所以如果天数差异为 2,我想从周一到上周四而不是周六。

如有任何帮助,我们将不胜感激。

您可以将天数循环到 add/subtract,然后跳过增量或 iterator(如果是周末)。

function addDaysWithoutWeekends(days, date) {
  var d = date || moment();
  var retDate = moment(d);
  var ittr = (days / Math.abs(days));
  while (days !== 0) {
    retDate.add(ittr, 'days');
    if (!isWeekend(retDate)) {
      days += (ittr * -1);
    }
  }
  return retDate;
}

function print(d) {
  console.log(d.format('DD/MM/YYYY'));
}

function isWeekend(date) {
  return date.day() % 6 == 0;
}

// Add days
print(addDaysWithoutWeekends(10))

// Subtract days
print(addDaysWithoutWeekends(-10))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.0/moment.min.js"></script>

您可以创建一个单独的 subtractWeekdays 函数,但您最终会重复使用大部分代码。主要区别在于 date.add 中的 1 和 days 为负时 while 循环跳过。我们可以通过一些小改动来解决这个问题:

  1. 在调用 [=13= 时,使用一个伪常量(为简单起见,我将其命名为 dayConst)根据上下文为正或负,而不是硬编码的 1 ]
  2. 使用条件检查 days 是否为负数,如果是,则修改 dayConst 以反映这一点,并使天数为正数,以便 while 循环在任一情况下运行。

function addWeekdays (date, days) {
  // make a 'pseudo-constant' to represent the # used when adding/subtracting days
  var dayConst = 1;
  date = moment(date); // use a clone

  // add functionality for subtraction here
  if (days < 0) {
    dayConst = -1;
    days = -days;
  }

  while (days > 0) {
    // and then dayConst will be -1 if days is negative.
    date = date.add(dayConst, 'days');

    // decrease "days" only if it's a weekday.
    if (date.isoWeekday() !== 6 && date.isoWeekday() !== 7) {
      days -= 1;
    }
  }
  return date;
}

// How I tested them (It's Wednesday Nov 23 here and now, so 3 days +/-        
// is Monday Nov 28 and last Friday Nov 18, respectively)
console.log(addWeekdays(new Date(), 3).format("YYYY MM DD dddd"));
console.log(addWeekdays(new Date(), -3).format("YYYY MM DD dddd"));