【问题标题】:Subtract days considering weekends考虑到周末减去天数
【发布时间】:2016-11-23 12:46:34
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/20788411/…
  • @Rajesh 这是我的函数,其中包含如何添加不包括周末的天数,但我仍然不确定如何减去不包括周末的天数
  • @gus27 由于days-4 返回,因此不会触发while 循环。

标签: javascript jquery date momentjs weekend


【解决方案1】:

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

  1. 在调用date.add 时,使用一个伪常数(为简单起见,我将其命名为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"));

【讨论】:

    【解决方案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))
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.0/moment.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 当我尝试这个时,我陷入了无限循环
    • 你能分享你的案例吗?你能创造一个小提琴吗?
    • @mcclosa 你抄袭isWeekend了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2020-05-29
    • 2021-10-23
    相关资源
    最近更新 更多