web-dev-qa-db-fra.com

Moment.js - différence de deux dates en nombre de jours

J'obtiens des résultats incorrects en essayant de trouver la différence numérique entre deux dates:

var startDate = moment( $('[name="date-start"]').val(), "DD.MM.YYYY"), // $('[name="date-start"]').val() === "13.04.2016"
endDate       = moment( $('[name="date-end"]'  ).val(), "DD.MM.YYYY"); // $('[name="date-end"]').val() === "28.04.2016"

var diff = startDate.diff(endDate);

console.log( moment(diff).format('E') );

Entre 13.04.2016 et 28.04.2016 je ne devrais pas avoir cette différence est 3 ou 2 jours ...

J'ai essayé de multiples combinaisons:

  • permutez startDate.diff(endDate) avec endDate.diff(startDate)
  • format('E') avec quelque chose que je suis venu chercher le SO

résultat: tout le temps que je reçois cette différence est de 3 ou 2 jours.

Qu'est-ce que je fais mal? Merci d'avance.

26
Miloshio

À partir du moment.js docs : format('E') correspond au jour de la semaine. Ainsi, votre diff est calculé le jour de la semaine, qui doit être compris entre 1 et 7.

À partir du moment.js docs encore, voici ce qu’ils suggèrent: 

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') // 1

Voici un JSFiddle pour votre cas particulier:

$('#test').click(function() {
  var startDate = moment("13.04.2016", "DD.MM.YYYY");
  var endDate = moment("28.04.2016", "DD.MM.YYYY");

  var result = 'Diff: ' + endDate.diff(startDate, 'days');

  $('#result').html(result);
});
#test {
  width: 100px;
  height: 100px;
  background: #ffb;
  padding: 10px;
  border: 2px solid #999;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.js"></script>

<div id='test'>Click Me!!!</div>
<div id='result'></div>

55
dubes

la méthode diff renvoie la différence en millisecondes. Instancier moment(diff) n'a pas de sens.

Vous pouvez définir une variable:

var dayInMilliseconds = 1000 * 60 * 60 * 24;

et ensuite l'utiliser comme ceci:

diff / dayInMilliseconds // --> 15

Modifier

en fait, cela est construit dans la méthode diff, la réponse de Dubès est meilleure

0
VonD

$('#test').click(function() {
  var startDate = moment("01.01.2019", "DD.MM.YYYY");
  var endDate = moment("01.02.2019", "DD.MM.YYYY");

  var result = 'Diff: ' + endDate.diff(startDate, 'days');

  $('#result').html(result);
});
#test {
  width: 100px;
  height: 100px;
  background: #ffb;
  padding: 10px;
  border: 2px solid #999;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.js"></script>

<div id='test'>Click Me!!!</div>
<div id='result'></div>

0
Sobhan Das

Voici comment obtenir la différence complète et complète de deux dates.

 function diffYMDHMS(date1, date2) {

    let years = date1.diff(date2, 'year');
    date2.add(years, 'years');

    let months = date1.diff(date2, 'months');
    date2.add(months, 'months');

    let days = date1.diff(date2, 'days');
    date2.add(days, 'days');

    let hours = date1.diff(date2, 'hours');
    date2.add(hours, 'hours');

    let minutes = date1.diff(date2, 'minutes');
    date2.add(minutes, 'minutes');

    let seconds = date1.diff(date2, 'seconds');

    console.log(years + ' years ' + months + ' months ' + days + ' days ' + hours + ' 
    hours ' + minutes + ' minutes ' + seconds + ' seconds'); 

    return { years, months, days, hours, minutes, seconds};
}
0
Muneeb JS

$('#test').click(function() {
  var todayDate = moment("01.01.2019", "DD.MM.YYYY");
  var endDate = moment("08.02.2019", "DD.MM.YYYY");

  var result = 'Diff: ' + todayDate.diff(endDate, 'days');

  $('#result').html(result);
});
#test {
  width: 100px;
  height: 100px;
  background: #ffb;
  padding: 10px;
  border: 2px solid #999;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.js"></script>

<div id='test'>Click Me!!!</div>
<div id='result'></div>

0
Sobhan Das