2016-11-23 103 views
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星期五”)至26日(“A星期一”) ,其他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,我想从周一到上周四,而不是周六。

任何帮助将不胜感激。

+1

这可能帮助:http://stackoverflow.com/questions/20788411/how-to-exclude-weekends-between-two-dates-using-moment-js – Rajesh

+0

@Rajesh那在这里我得到了我的功能到如何添加天,不包括周末,但我仍然不确定如何减去天,不包括周末 – mcclosa

+0

@ gus27由于'days'回来为'线程-4' while循环将不火。 – mcclosa

回答

1

你可以做一个独立的subtractWeekdays功能,但你最终最重用的代码。主要区别在于在date.add和while循环跳过天时为负数。调用date.add

  1. 使用伪常数(我把它命名为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")); 
+0

这工作完美,谢谢 – mcclosa

+0

你非常欢迎! –

0

您可以将天数循环至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>

+0

当我尝试此操作时,我陷入无限循环 – mcclosa

+0

您可以分享您的案例吗?你能创造一个小提琴吗? – Rajesh

+0

@mcclosa你是否复制'isWeekend'? – Rajesh