2011-01-31 8 views
2

J'ai deux dateurs de l'interface utilisateur jQuery et quand ils ont tous deux eu des dates choisies, j'aimerais que la différence entre ces dates soit affichée dans un input[type="text"] séparé dès que la deuxième date est sélectionnée.jQuery Datepicker nombre de jours

En outre, j'aimerais idéalement que mon compte soustrait tous les jours de week-end et compte seulement les jours du lundi au vendredi.

Code Mon (pertinent) est la suivante:

JS:

$('#firstday, #lastday').datepicker({ 
    dateFormat: 'dd/mm/yy' 
}); 

XHTML:

<label for="firstday">First Day of Leave</label> 
<input type="text" name="firstday" id="firstday" /> 

<label for="lastday">Last Day of Leave</label> 
<input type="text" name="lastday" id="lastday" /> 

<label for="totaldays">Total Days</label> 
<input type="text" name="totaldays" id="totaldays" /> 

Beaucoup de recherche m'a conduit à beaucoup de solutions différentes, dont aucune Je peux me mettre au travail comme je le voudrais, donc toutes les idées seraient appréciées.

+1

Avez-vous accès à un code dorsal tel que PHP ou .NET? Il peut être plus facile de reporter les valeurs sur le serveur et de renvoyer la différence de date. Aussi, avez-vous vu cette question Stack Overflow? http://stackoverflow.com/questions/542938/how-do-i-get-the-number-of-days-between-two-dates-in-jquery –

+0

Oui, j'ai accès à PHP. Je n'envisagerais jamais de suivre la voie JavaScript pour cela, mais comme je sais que les seules machines qui auront jamais besoin d'utiliser cette page ne peuvent pas éteindre JS, je pensais que je serais en sécurité pour l'utiliser. Merci pour le lien, je vais jeter un coup d'oeil à travers cela. –

Répondre

6

Quelque chose comme cela devrait fonctionner:

$("#firstday, #lastday").datepicker({ 
    onSelect: function(){ 

    // Date will give time difference in miliseconds, that is why we divide with 1000*60*60*24 

    var firstday = new Date($("#firstday").val().split("/").reverse().join(",")); 
    var lastday = new Date($("#lastday").val().split("/").reverse().join(","); 
    $("#totaldays").val((lastday - firstday)/86400000);   
    } 
}); 

Dans la console de nœud donne:

> x = new Date("18/5/2010".split("/").reverse().join(",")) 
Mon, 17 May 2010 22:00:00 GMT 
> y = new Date("18/5/2015".split("/").reverse().join(",")) 
Sun, 17 May 2015 22:00:00 GMT 
> x-y 
-157766400000 
> y-x 
157766400000 
> (y-x)/86400000 
1826 

- EDIT -

Lorsque vous avez date de début et de fin numéro de date de jours ce week-end est facilement calculé en utilisant getDay() qui revient de 0 pour dimanche, 1 pour lundi ... 6 pour samedi.

Vous pouvez utiliser .getMonth() et .getDate() combiné avec quelques autres conditions {} pour les vacances.

var weekend_count = 0; 
for (i = firstday.valueOf(); i <= lastday.valueOf(); i+= 86400000){ 
var temp = new Date(i); 
if (temp.getDay() == 0 || temp.getDay() == 6) { 
    weekend_count++; 
} 
} 

et à la fin vous venez

$("#totaldays").val((lastday - firstday)/86400000 - weekend_count); 

Juste pour faire une note à la fin. Vous devriez probablement extrapoler ce code (autant que possible) dans une fonction séparée afin de garder votre code plus facile à maintenir et au cas où vous auriez besoin de la même fonction à un autre endroit.

Bonne chance.

+0

Salut, merci pour la réponse. J'ai combiné votre code avec mon format dateFormat, mais il génère le bon vieux problème "NaN". Je vais avoir une pièce sur ... –

+0

J'ai fait quelques corrections. Juste pour ajouter, vous pouvez utiliser Math.abs (x-y) pour ne pas tenir compte de la valeur négative. – Krule

+0

Ouais ça a l'air bien, à la vôtre. J'ai ajouté un '+1' pour rendre les dates inclusives mais c'est génial. Avez-vous une idée de la façon de réduire les week-ends ?! –

Questions connexes