464 votes

Comment obtenir le nombre de jours entre deux dates en JavaScript?

Comment obtenir le nombre de jours entre deux dates en JavaScript? Par exemple, donné deux dates dans les zones de saisie:

 <input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>
 

453voto

Miles Points 12977
function parseDate(str) {
    var mdy = str.split('/')
    return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

function daydiff(first, second) {
    return (second-first)/(1000*60*60*24);
}

alert(daydiff(parseDate($('#first').val()), parseDate($('#second').val())));

221voto

Michael Liu Points 15764

De cette écriture, un seul des autres réponses gère correctement l'heure d'été (daylight saving time) des transitions. Voici les résultats sur un système qui se trouve en Californie:

                                        1/1/2013- 3/10/2013- 11/3/2013-
User       Formula                      2/1/2013  3/11/2013  11/4/2013  Result
---------  ---------------------------  --------  ---------  ---------  ---------
Miles                   (d2 - d1) / N   31        0.9583333  1.0416666  Incorrect
some         Math.floor((d2 - d1) / N)  31        0          1          Incorrect
fuentesjr    Math.round((d2 - d1) / N)  31        1          1          Correct
toloco     Math.ceiling((d2 - d1) / N)  31        1          2          Incorrect

N = 86400000

Bien qu' Math.round renvoie des résultats corrects, je pense que c'est un peu maladroit. Au lieu de cela, explicitement, de la comptabilité pour la modification du décalage UTC lorsque l'heure d'été commence ou se termine, nous pouvons utiliser exacte de l'arithmétique:

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

alert(daysBetween($('#first').val(), $('#second').val()));

Explication

JavaScript date de calculs sont difficiles parce qu' Date objets magasin de temps à l'interne en UTC, pas de temps local. Par exemple, 3/10/2013 12:00 AM, Heure normale du Pacifique (UTC-08:00) est stockée en tant que 3/10/2013 8:00 UTC, et 3/11/2013 12:00 AM, Heure Avancée du Pacifique (UTC-07:00) est stockée en tant que 3/11/2013 7:00 h UTC. En ce jour, de minuit à minuit, heure locale, il est seulement de 23 heures à l'UTC!

Mais un jour dans l'heure locale peut avoir plus ou moins de 24 heures, un jour à l'UTC est toujours exactement 24 heures.1 L' daysBetween méthode indiquée ci-dessus prend le parti de ce fait en première convocation, treatAsUTC à ajuster l'heure locale à minuit UTC, avant soustraction et la division.

1. JavaScript ignore les secondes intercalaires.

126voto

some Points 18965

Le moyen le plus simple de faire la différence entre deux dates:

 var diff =  Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000);
 

Vous obtenez les jours de différence (ou NaN si un ou les deux ne pouvaient pas être analysés). La date d'analyse a donné le résultat en millisecondes et pour l'obtenir par jour, vous devez le diviser par 24 * 60 * 60 * 1000

Si vous voulez le diviser par jours, heures, minutes, secondes et millisecondes:

 function dateDiff( str1, str2 ) {
    var diff = Date.parse( str2 ) - Date.parse( str1 ); 
    return isNaN( diff ) ? NaN : {
    	diff : diff,
    	ms : Math.floor( diff            % 1000 ),
    	s  : Math.floor( diff /     1000 %   60 ),
    	m  : Math.floor( diff /    60000 %   60 ),
    	h  : Math.floor( diff /  3600000 %   24 ),
    	d  : Math.floor( diff / 86400000        )
    };
}
 

Voici ma version refactorisée de la version James:

 function mydiff(date1,date2,interval) {
    var second=1000, minute=second*60, hour=minute*60, day=hour*24, week=day*7;
    date1 = new Date(date1);
    date2 = new Date(date2);
    var timediff = date2 - date1;
    if (isNaN(timediff)) return NaN;
    switch (interval) {
        case "years": return date2.getFullYear() - date1.getFullYear();
        case "months": return (
            ( date2.getFullYear() * 12 + date2.getMonth() )
            -
            ( date1.getFullYear() * 12 + date1.getMonth() )
        );
        case "weeks"  : return Math.floor(timediff / week);
        case "days"   : return Math.floor(timediff / day); 
        case "hours"  : return Math.floor(timediff / hour); 
        case "minutes": return Math.floor(timediff / minute);
        case "seconds": return Math.floor(timediff / second);
        default: return undefined;
    }
}
 

112voto

stephenbez Points 1251

Je recommande d'utiliser la bibliothèque moment.js ( http://momentjs.com/docs/#/displaying/difference/ ). Il gère correctement l'heure d'été et, en général, il est agréable de travailler avec.

Exemple:

 var start = moment("2013-11-04");
var end = moment("2013-11-03");
start.diff(end, "days")
1
 

41voto

fuentesjr Points 10360

Je voudrais aller de l'avant et saisir ce petit utilitaire et dans ce que vous trouverez des fonctions à cela pour vous. Voici un petit exemple:

     	<script type="text/javascript" src="date.js"></script>
    	<script type="text/javascript">
    		var minutes = 1000*60;
    		var hours = minutes*60;
    		var days = hours*24;

    		var foo_date1 = getDateFromFormat("02/10/2009", "M/d/y");
    		var foo_date2 = getDateFromFormat("02/12/2009", "M/d/y");

    		var diff_date = Math.round((foo_date2 - foo_date1)/days);
    		alert("Diff date is: " + diff_date );
    	</script>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X