1
votes

Moment.js Durée entre deux dates

Comment obtenir le décalage horaire entre deux variables de dates différentes, en particulier en années, mois et jours en utilisant moment.js?

J'ai trouvé cette méthode mais j'obtiens toujours des résultats étranges. Parfois, le résultat est un mois à l'avance, alors j'ai ajouté une partie de soustraction d'un mois pour que le résultat soit correct, mais lorsque la différence entre les deux dates peut être divisée en années entières, cela devient alors un mois en retard, mais si je supprime le mois de soustraction en partie, cela devient encore plus déréglé.

Je voudrais également le formater comme "X ans, Y mois, Z jours", mais je ne peux pas non plus comprendre comment le formater de cette manière .

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
var dateOne = new Date(2000,07,16);
var dateTwo = new Date (1990,07,16);
var updatedDate = moment(dateOne).format('ll');
   
var x = moment(dateOne, 'DD/MM/YYYY').diff(moment(dateTwo, 'DD/MM/YYYY'))
var y = moment.duration(x);
var why = moment(x).subtract(1, 'M');
var z = Math.floor(y.asYears()) + moment.utc(why).format('/MM/DD');
console.log(z);


3 commentaires

réponse


Vous faites quelque chose de bizarre. D'une part, les dates et les durées sont des choses complètement différentes, vous ne pouvez pas mettre en forme une durée en tant que date. Pour un autre, la différence entre ces deux est exactement de 10 ans: moment (dateOne) .diff (dateTwo, 'years', true)


Il n'y a aucune raison d'inclure jQuery. dateOne est un objet Date, donc pas besoin du deuxième argument dans moment (dateOne, 'JJ / MM / AAAA') . Vous pouvez inclure moment.js en tant que bibliothèque externe à l'aide d'un CDN, par exemple https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/mome‌ nt.min.js


3 Réponses :


1
votes

Essayez ceci peut-être?

var firstDate = moment();
var secondDate = moment("2018-03-19");
var yearDiff = firstDate.diff(secondDate, "year");
var monthDiff = firstDate.diff(secondDate, "month");
var dayDiff = firstDate.diff(secondDate, "day");
console.log(yearDiff + " Years, " + monthDiff + " Months, " + dayDiff + " Days");

https://jsfiddle.net/px1brLdk /


1 commentaires

Une bonne réponse devrait expliquer pourquoi l'OP a son problème et comment votre code le résout. En outre, vous pouvez publier votre code sous forme d'extrait de code exécutable et inclure des bibliothèques externes. Si vous faites cela, vous constaterez que les valeurs sont la différence totale pour chaque intervalle, donc le 21/02/2019, vous obtiendrez 0 an, 11 mois, 339 jours.



1
votes

Comme indiqué par d'autres personnes dans les commentaires, vous ne pouvez pas formater une durée en tant que date et comme dateOne et dateTwo sont des objets Date, il n'est pas nécessaire de le deuxième argument dans moment (dateOne, 'JJ / MM / AAAA') , utilisez simplement moment (Date) .

Moverover, veuillez noter que lorsque vous utilisez new Date (year, monthIndex, day) monthIndex commence à 0, voir MDN docs :

L'argument monthIndex est basé sur 0. Cela signifie que janvier = 0 et décembre = 11 .

Vous pouvez utiliser le moment-duration-format plug-in pour formater la durée de momentjs selon vos besoins, voir format () code> sur la page du plug-in .

Voici un exemple en direct:

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/2.2.2/moment-duration-format.min.js"></script>
var dateOne = new Date(2000, 7, 16);
var dateTwo = new Date(1990, 7, 16);

var diff = moment(dateOne).diff(moment(dateTwo))
var dur = moment.duration(diff);
var result = dur.format();
console.log(result);


0 commentaires

1
votes

Moment a une méthode appelée .diff () Utilisez celle-là. https://momentjs.com/docs/#/displaying/difference/ < / p>


0 commentaires