2016-11-23 125 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