web-dev-qa-db-fra.com

Obtenir la différence entre 2 dates en JavaScript?

Comment puis-je obtenir la différence entre 2 dates en jours entiers (je ne veux pas de fractions de jour)

var date1 = new Date('7/11/2010');
var date2 = new Date('12/12/2010');
var diffDays = date2.getDate() - date1.getDate(); 
alert(diffDays)

J'ai essayé ce qui précède mais cela n'a pas fonctionné.

472
chobo2

Voici un moyen :

const date1 = new Date('7/13/2010');
const date2 = new Date('12/15/2010');
const diffTime = Math.abs(date2.getTime() - date1.getTime());
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); 
console.log(diffDays);

Notez que nous devons inclure la date entre guillemets. Le reste du code obtient la différence de temps en millisecondes puis se divise pour obtenir le nombre de jours. Date attend le format mm/jj/aaaa.

726
TNi

Une solution plus correcte

... étant donné que les dates ont naturellement des informations sur le fuseau horaire, qui peuvent couvrir des régions avec des ajustements différents de l'heure d'été

Les réponses précédentes à cette question ne prennent pas en compte les cas où les deux dates en question couvrent un changement d'heure d'été (DST). La date à laquelle la modification de l'heure d'été a lieu aura une durée en millisecondes qui est != 1000*60*60*24, de sorte que le calcul typique échouera.

Vous pouvez contourner ce problème en normalisant d’abord les deux dates au format UTC, puis en calculant la différence entre ces deux dates UTC.

Maintenant, la solution peut être écrite comme,

const _MS_PER_DAY = 1000 * 60 * 60 * 24;

// a and b are javascript Date objects
function dateDiffInDays(a, b) {
  // Discard the time and time-zone information.
  const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
  const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());

  return Math.floor((utc2 - utc1) / _MS_PER_DAY);
}

// test it
const a = new Date("2017-01-01"),
    b = new Date("2017-07-25"),
    difference = dateDiffInDays(a, b);

Cela fonctionne parce que l'heure UTC n'observe jamais l'heure d'été. Voir TC observe-t-il l'heure d'été?

p.s. Après avoir discuté de certains commentaires sur cette réponse, une fois que vous avez compris les problèmes liés aux dates javascript qui couvrent une limite DST, il existe probablement plus d'une façon de la résoudre. Ce que j'ai fourni ci-dessus est une solution simple (et testée). Je serais intéressé de savoir s'il existe une solution arithmétique/mathématique simple au lieu d'instancier les deux nouveaux objets Date. Cela pourrait potentiellement être plus rapide.

663
Shyam Habarakada

Voici une solution utilisant moment.js :

var a = moment('7/11/2010','M/D/YYYY');
var b = moment('12/12/2010','M/D/YYYY');
var diffDays = b.diff(a, 'days');
alert(diffDays);

J'ai utilisé vos valeurs d'entrée originales, mais vous n'avez pas spécifié le format, j'ai donc supposé que la première valeur était le 11 juillet. S'il était prévu que ce soit le 7 novembre, ajustez alors le format sur D/M/YYYY.

83
Matt Johnson-Pint
var date1 = new Date("7/11/2010");
var date2 = new Date("8/11/2010");
var diffDays = parseInt((date2 - date1) / (1000 * 60 * 60 * 24)); 

alert(diffDays )
28
volkan er

J'ai essayé de nombreuses façons et j'ai constaté que l'utilisation de Datepicker était la meilleure solution, mais le format de la date pose des problèmes de JavaScript ....

Alors, voici ma réponse et peut être épuisé.

<input type="text" id="startdate">
<input type="text" id="enddate">
<input type="text" id="days">

<script src="https://code.jquery.com/jquery-1.8.3.js"></script>
<script src="https://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/redmond/jquery-ui.css" />
<script>
$(document).ready(function() {

$( "#startdate,#enddate" ).datepicker({
changeMonth: true,
changeYear: true,
firstDay: 1,
dateFormat: 'dd/mm/yy',
})

$( "#startdate" ).datepicker({ dateFormat: 'dd-mm-yy' });
$( "#enddate" ).datepicker({ dateFormat: 'dd-mm-yy' });

$('#enddate').change(function() {
var start = $('#startdate').datepicker('getDate');
var end   = $('#enddate').datepicker('getDate');

if (start<end) {
var days   = (end - start)/1000/60/60/24;
$('#days').val(days);
}
else {
alert ("You cant come back before you have been!");
$('#startdate').val("");
$('#enddate').val("");
$('#days').val("");
}
}); //end change function
}); //end ready
</script>

un Fiddle peut être vu ici DÉMO

12
Mikeys4u

C'est le code pour soustraire une date à une autre. Cet exemple convertit les dates en objets car la fonction getTime () ne fonctionnera que si c'est un objet Date.

    var dat1 = document.getElementById('inputDate').value;
                var date1 = new Date(dat1)//converts string to date object
                alert(date1);
                var dat2 = document.getElementById('inputFinishDate').value;
                var date2 = new Date(dat2)
                alert(date2);

                var oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds
                var diffDays = Math.abs((date1.getTime() - date2.getTime()) / (oneDay));
                alert(diffDays);
2
Pec1983