Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 减去考虑周末的天数_Javascript_Jquery_Date_Momentjs_Weekend - Fatal编程技术网

Javascript 减去考虑周末的天数

Javascript 减去考虑周末的天数,javascript,jquery,date,momentjs,weekend,Javascript,Jquery,Date,Momentjs,Weekend,例如,我有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 其目的是,如果我

例如,我有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日(“星期五”)更改为26日(“星期一”),则其他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,我希望从周一到上周四,而不是周六。


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

您可以循环使用天数来添加/减去
,然后跳过增量或
迭代器(如果是周末)

函数addDaysWithoutWeekends(天、日期){
var d=日期| |时刻();
var retDate=力矩(d);
var ittr=(天/数学绝对值(天));
而(天!==0){
返回日期。添加(ittr,“天”);
如果(!isWeekend(retDate)){
天数+=(ittr*-1);
}
}
归还日期;
}
功能打印(d){
console.log(d.format('DD/MM/YYYY'));
}
功能是周末(日期){
返回日期.day()%6==0;
}
//增加天数
打印(添加日期,不包括周末(10))
//减去天数
打印(不包括周末(-10)的添加日数)

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

  • 调用
    date.add时,使用一个伪常量(为了简单起见,我将其命名为
    daycont
    ),它将根据上下文而定为正或负,而不是硬编码的
    1
  • 使用条件检查
    days
    是否为负值,如果为负值,则修改
    dayConst
    以反映该值,并将days设置为正值,这样while循环在任何情况下都会运行

  • 函数添加工作日(日期,天){
    //制作一个“伪常量”来表示加减天数时使用的#
    var dayConst=1;
    日期=时刻(日期);//使用克隆
    //在此处添加减法功能
    如果(天数<0){
    dayConst=-1;
    天数=-天;
    }
    而(天数>0){
    //如果天是负数,那么dayConst将是-1。
    date=date.add(dayConst,'days');
    //只有在工作日时才减少“天数”。
    if(date.isoWeekday()!==6和date.isoWeekday()!==7){
    天数-=1天;
    }
    }
    返回日期;
    }
    //我是如何测试它们的(现在是11月23日星期三,所以3天+/-
    //分别是11月28日星期一和11月18日星期五)
    log(addWeekdays(newdate(),3).format(“YYYY-MM-DD-dddddd”);
    log(addWeekdays(新日期(),-3).format(“YYYY-MM-DD-dddddd”);
    
    这可能会有所帮助:@Rajesh这是我将函数引入如何添加不包括周末在内的天数的线程,但我仍然不确定如何减去不包括周末在内的天数weekends@gus27由于
    days
    -4
    的形式返回,while循环将不会启动。尝试此操作时,我陷入了一个无休止的循环中。您能分享您的信息吗案例你能做一把小提琴吗?@mcclosa你复制了
    isWeekend
    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"));