2016-11-23 3 views
2

J'ai un 4 dropdowns qui sont peuplées par dates, par exemplejours Soustraire compte tenu des week-ends

["23rd December 2016","26th December 2016","27th December 2016","28th December 2016", "29th December 2016"] 

Dans ce scénario, je veux éviter le week-end.

La valeur de chaque menu déroulant respectif est la suivante

- 23rd December 2016 
- 26th December 2016 
- 27th December 2016 
- 28th December 2016 

L'objectif est que si je change la valeur de la première date du 23 (« Un vendredi ») à 26 (« lundi ») , les 3 autres dates passeront un jour aux valeurs suivantes;

- 26th December 2016 
- 27th December 2016 
- 28th December 2016 
- 29th December 2016 

Cela fonctionne très bien avec le code suivant

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; 
} 

La valeur de chaque menu déroulant une boucle dans cette fonction, date est la valeur de la date de la liste déroulante et days est le nombre de jours de différence entre la première date et la nouvelle date. Le problème que j'ai est que si j'essaie alors de passer du 26ème au 23ème, je ne suis pas sûr de savoir comment le recréer pour obtenir ce qui suit;

- 23rd December 2016 
- 26th December 2016 
- 27th December 2016 
- 28th December 2016 

Fondamentalement, il est un moyen de soustraire la différence de jours exsudant le week-end, donc si la différence de jours est 2, je voudrais aller du lundi au jeudi précédent et non au samedi.

Toute aide serait grandement appréciée.

+1

Cela pourrait aider: http://stackoverflow.com/questions/20788411/how-to-exclude-weekends-between-two-dates-using-moment-js – Rajesh

+0

@Rajesh Ce est le fil où j'ai eu ma fonction dans la façon d'ajouter des jours excluant les week-ends mais je ne suis toujours pas sûr de savoir comment soustraire les jours excluant les weekends – mcclosa

+0

@ gus27 En raison de la 'jours' revenir en' -4' la boucle while ne se déclenche pas . – mcclosa

Répondre

1

Vous pouvez faire une fonction subtractWeekdays séparée mais vous finiriez réutiliser la plupart du code. La différence majeure est le 1 dans date.add et le saut de boucle while lorsque les jours sont négatifs. Nous pouvons résoudre ce problème avec quelques changements mineurs:

  1. Utilisez un (je l'ai nommé dayConst pour la simplicité d'exemple) pseudo-constante qui sera fonction du contexte positif ou négatif, au lieu d'un 1 hardcoded, lorsque vous appelez date.add
  2. Utilisez un conditionnel pour vérifier si days est négatif et si c'est le cas, modifiez dayConst pour refléter cela, et rendez les jours positifs, afin que la boucle while s'exécute dans les deux cas.

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

Cela a fonctionné parfaitement, merci – mcclosa

+0

Vous êtes les bienvenus! –

0

Vous pouvez effectuer une boucle sur le nombre de jours à add/subtract, puis ignorer l'incrément ou iterator si son week-end.

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

Je suis coincé dans une boucle sans fin quand j'essaye cela – mcclosa

+0

Pouvez-vous partager votre cas? Pouvez-vous créer un violon? – Rajesh

+0

@mcclosa avez-vous copié 'isWeekend'? – Rajesh