2

例如,我有 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,我想从周一到上周四而不是周六。

任何帮助将不胜感激。

4

2 回答 2

1

您可以遍历天数,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>

于 2016-11-23T13:05:47.910 回答
1

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

  1. 调用时使用伪常数(我dayConst为简单起见命名),根据上下文,而不是硬编码,它是正数还是负数1date.add
  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"));
于 2016-11-23T13:39:08.843 回答