web-dev-qa-db-fra.com

Moment.js - Différence en deux anniversaires en années, mois et jours

Je cherche un moyen d'utiliser moment pour analyser deux dates, pour montrer la différence.

Je veux l'avoir sur le format: "X années, Y mois, Z jours".

Depuis des années et des mois, la bibliothèque momentanée et l’opérateur modulo travaillent à Nice. Mais pour les jours, c’est un autre récit, car je ne veux pas gérer les années bissextiles et tout cela seul. Jusqu'ici la logique que j'ai dans ma tête est la suivante: 

var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);

var years = a.diff(b, 'years');
var months = a.diff(b, 'months') % 12;
var days = a.diff(b, 'days');
// Abit stuck here as leap years, and difference in number of days in months. 
// And a.diff(b, 'days') returns total number of days.
return years + '' + months + '' + days;
21

Vous pouvez obtenir la différence en années et l'ajouter à la date initiale; puis obtenez la différence en mois et ajoutez-la à la date initiale. 

Ce faisant, vous pouvez maintenant facilement obtenir la différence en jours et éviter d'utiliser également l'opérateur modulo.

Exemple ici

var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);

var years = a.diff(b, 'year');
b.add(years, 'years');

var months = a.diff(b, 'months');
b.add(months, 'months');

var days = a.diff(b, 'days');

console.log(years + ' years ' + months + ' months ' + days + ' days');
// 8 years 5 months 2 days

Je ne suis pas au courant d'un meilleur moyen intégré d'y parvenir, mais cette méthode semble bien fonctionner.

28
Josh Crozier

Moment.js a également duration object. Un moment est défini comme un point dans le temps, alors que la durée est définie comme une durée qui correspond essentiellement à ce que vous voulez.

var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);

var diffDuration = moment.duration(a.diff(b));

console.log(diffDuration.years()); // 8 years
console.log(diffDuration.months()); // 5 months
console.log(diffDuration.days()); // 2 days

Ce que @Josh suggère peut fonctionner, mais ce n’est certainement pas la bonne façon de calculer la différence en 2 moments.

23
Kunal Kapadia

Je viens de convertir la réponse answer de Josh Crozier en une fonction et d'ajouter heures, minutes et secondes également.

 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

La solution ci-dessus ne fonctionne pas avec momentjs 2.19.1

Puis avec la référence de La date de jonction du calcul ne fonctionne pas avec le moment 2.19.1 j’ai implémenté une nouvelle solution avec dernière solution pour momentjs 2.19.1.

Paquets npm requis:

" moment ": "^ 2.19.4",

" moment-durée-format ": "^ 1.3.0",

" réagir-moment ": "^ 0.6.8",

import suivant dans les réactions:

 import moment from "moment";
 import Moment from "react-moment";
 import momentDurationFormatSetup from "moment-duration-format";

var DOJ = moment([work_data.joining_date]).format("YYYY,MM,DD");      
var today = moment().format("YYYY,MM,DD");      
var totalMonths =  parseInt(moment(today).diff(moment(DOJ), 'months'));      
var totalDuration = moment.duration(totalMonths, "months").format();      
if(totalDuration.search('1y') > -1) {
   totalDuration = totalDuration.replace("1y", "1 Year,");
} else {
   totalDuration = totalDuration.replace("y", " Years,");
}

if(totalDuration.search('1m') > -1){
  totalDuration = totalDuration.replace("1m", "1 Month");
} else {
  totalDuration = totalDuration.replace("m", " Months");
}

console.log(totalDuration);
0
Chandresh

Ceci est une autre réponse. Vérifié avec Age Calculator

function calculateAge(){
    ageText = jQuery("#dob").closest(".form-group").find(".age-text");
    ageText.text("");
    level2.dob = jQuery("#dob").val();
    if(!level2.dob) return;
    level2.mdob= moment(level2.dob, 'DD-MM-YYYY');
    if(!level2.mdob.isValid()){
        alert("Invalid date format");
        return;
    }
    level2.targetDate = moment();//TODO: Fill in the target date
    level2.months = level2.targetDate.diff(level2.mdob, 'months'); // Calculate the months
    let years = parseInt(level2.months/12); // A year has 12 months irrespective or leap year or not
    let balanceMonths = level2.months%12; // The balance gives the number of months 
    let days;
    if(!balanceMonths){ // If no balance months, then the date selected lies in the same month
        months = 0; // so months = 0
        days = level2.targetDate.diff(level2.mdob, 'days'); // only the days difference
    }else{
    months = balanceMonths;
    dob_date = level2.mdob.date();
    target_month = level2.targetDate.month();
    construct_date = moment().month(target_month).date(dob_date);
    days = level2.targetDate.diff(construct_date, 'days')+1; // There might be one day missed out. Not sure on UTC
}

ageText = years +" years " + months+ " months " + days +" days";
}
0