224 votes

Différence en mois entre deux dates en JavaScript

Comment puis-je calculer la différence entre deux objets Date() en JavaScript, tout en ne renvoyant que le nombre de mois de la différence ?

Toute aide serait la bienvenue :)

0 votes

Un mois n'est pas une unité de mesure très précise, car la durée du mois change en fonction du mois dans lequel on se trouve. Si un intervalle dure 30 jours entre janvier et février, c'est moins d'un mois si l'on raisonne en termes de mois de 31 jours, mais plus d'un mois si l'on considère que février compte 28 ou 29 jours.

8 votes

Question pas très bien définie. Est-ce que le 28 février 23:58 au 1er mars 00:01 est un mois ? Ou juste un jour ? Ou seulement trois minutes ? Ou les trois ?

2 votes

La personne qui doit mettre en œuvre cette mesure n'aura probablement pas de réponse, car son responsable n'a aucune idée de ce qu'elle demande :)

8voto

Différence en mois entre deux dates en JavaScript :

 start_date = new Date(year, month, day); //Create start date object by passing appropiate argument
 end_date = new Date(new Date(year, month, day)

total des mois entre la date de début et la date de fin :

 total_months = (end_date.getFullYear() - start_date.getFullYear())*12 + (end_date.getMonth() - start_date.getMonth())

8voto

Hamzeen Hameem Points 716

Vous pouvez également envisager cette solution, cette function renvoie la différence de mois en entier ou en nombre

Passer le date d'entrée en vigueur comme le premier ou le dernier param est tolérante aux pannes. Ce qui signifie que la fonction renverra toujours la même valeur.

const diffInMonths = (end, start) => {
   var timeDiff = Math.abs(end.getTime() - start.getTime());
   return Math.round(timeDiff / (2e3 * 3600 * 365.25));
}

const result = diffInMonths(new Date(2015, 3, 28), new Date(2010, 1, 25));

// shows month difference as integer/number
console.log(result);

1 votes

Vous devez multiplier par 365,25 pour tenir compte des années bissextiles.

6voto

James Points 321

Je sais que c'est vraiment tard, mais je le poste quand même au cas où cela aiderait d'autres personnes. Voici une fonction que j'ai inventée et qui semble faire un bon travail pour compter les différences de mois entre deux dates. Il est vrai qu'elle est beaucoup plus grossière que celle de M. Crowder, mais elle fournit des résultats plus précis en passant par l'objet date. Il est en AS3 mais vous devriez pouvoir laisser tomber le typage fort et vous aurez du JS. N'hésitez pas à le rendre plus agréable à regarder pour quiconque !

    function countMonths ( startDate:Date, endDate:Date ):int
    {
        var stepDate:Date = new Date;
        stepDate.time = startDate.time;
        var monthCount:int;

        while( stepDate.time <= endDate.time ) { 
            stepDate.month += 1;
            monthCount += 1;
        }           

        if ( stepDate != endDate ) { 
            monthCount -= 1;
        }

        return monthCount;
    }

0 votes

C'est le très probablement correct pour la plupart des situations. Il y a tellement d'exceptions et d'aléas dans notre calendrier que la meilleure approche est de déléguer leur gestion à une bibliothèque bien testée, comme Date(). Pour la plupart des périodes (courtes), cette méthode renverra la même réponse que les approches calculées, mais lorsque vous traitez de longues périodes (y compris les années bissextiles, les années bissextiles qui ne sont pas des années bissextiles, les secondes bissextiles, etc.), vous avez plus de chances de rencontrer une exception où la soustraction des mois et l'addition des années seront incorrectes. Consultez ma réponse pour connaître les cas où le calcul est préférable.

5voto

calvin Points 412

Pour développer la réponse de @T.J., si vous recherchez des mois simples, plutôt que des mois calendaires complets, vous pouvez simplement vérifier si la date de d2 est supérieure ou égale à celle de d1. En d'autres termes, si d2 est plus tard dans son mois que d1, alors il y a un mois de plus. Vous devriez donc être en mesure de faire cela :

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth() + 1;
    months += d2.getMonth();
    // edit: increment months if d2 comes later in its month than d1 in its month
    if (d2.getDate() >= d1.getDate())
        months++
    // end edit
    return months <= 0 ? 0 : months;
}

monthDiff(
    new Date(2008, 10, 4), // November 4th, 2008
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 16; 4 Nov – 4 Dec '08, 4 Dec '08 – 4 Dec '09, 4 Dec '09 – 4 March '10

Cela ne tient pas totalement compte des problèmes de temps (par exemple, le 3 mars à 16h00 et le 3 avril à 15h00), mais c'est plus précis et pour quelques lignes de code seulement.

5voto

nicotr014 Points 11

Considérez chaque date en termes de mois, puis soustrayez pour trouver la différence.

var past_date = new Date('11/1/2014');
var current_date = new Date();

var difference = (current_date.getFullYear()*12 + current_date.getMonth()) - (past_date.getFullYear()*12 + past_date.getMonth());

Vous obtiendrez ainsi la différence de mois entre les deux dates, sans tenir compte des jours.

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