355 votes

Comment ajouter des mois à une date en JavaScript ?

Je veux ajouter des mois à une date en JavaScript.

Par exemple : J'insère la date 06/01/2011 (format mm/dd/yyyy ) et je veux maintenant ajouter 8 mois à cette date. Je veux que le résultat soit 02/01/2012 .

Ainsi, en ajoutant des mois, l'année peut également augmenter.

0 votes

Si vous ajoutez 8 mois à la date du 06/01/2011, comment sera-t-elle changée en 02/01/2011 ? Pouvez-vous le préciser ?

1 votes

C'est un problème difficile à résoudre - que se passe-t-il si vous êtes le 31 d'un mois et que le mois cible n'a pas 31 jours ? Pire encore, que se passe-t-il si le mois cible est février ?

0 votes

@kalyan : si j'ajoute 8 mois à la date 06/01/2011(mm/jj/aaaa) alors ce sera 02/01/2012 car si nous ajoutons 06+08 = 14 et nous n'avons que 12 mois donc cela changera l'année et donnera le résultat 02/01/2012.

450voto

Acolyte Points 1119

Corrigé en date du 25.06.2019 :

var newDate = new Date(date.setMonth(date.getMonth()+8));

Vieux De aquí :

var jan312009 = new Date(2009, 0, 31);
var eightMonthsFromJan312009  = jan312009.setMonth(jan312009.getMonth()+8);

70 votes

Ce n'est pas une faute de frappe - le constructeur de la date utilise 0 pour janvier, et non 1.

1 votes

Et si, par exemple, vous ajoutez 1 au lieu de 8 ? Il afficherait le 31 février 2009, n'est-ce pas ?

2 votes

@Sampson. Non, il s'affichera le 3 mars 2009 :)

180voto

mu is too short Points 205090

Divisez votre date en composantes année, mois, et jour puis utilisez Date :

var d = new Date(year, month, day);
d.setMonth(d.getMonth() + 8);

La date se chargera de fixer l'année.

61 votes

Attention - cela ne fonctionne pas pour les cas limites, comme l'ajout au 31e jour de la plupart des mois. Par exemple, le 31 octobre 2011 + 1 mois en utilisant cette méthode correspond au 01 décembre 2011 en utilisant l'objet Date standard de Javascript. jsfiddle.net/KyleMit/jLbbk27v

1 votes

@KyleMit Ça dépend de ce que vous attendez.

7 votes

@xehpuk, oui, bien sûr, mais c'est no ce que la plupart des gens attendraient. Si j'ajoute un mois, je serais surpris que le mois aille d'octobre à décembre. 10 + 1 != 12 ... si je parle d'ajouter 31 jours, bien sûr, cela devrait simplement être 31 jours dans le futur. Quoi qu'il en soit, utilisez ce qui convient à votre cas d'utilisation, mais tenez compte des cas limites.

126voto

Jazaret Points 1444

J'ai jeté un coup d'œil à datejs et j'ai supprimé le code nécessaire pour ajouter des mois à une date en tenant compte des cas limites (année bissextile, mois plus courts, etc.) :

Date.isLeapYear = function (year) { 
    return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); 
};

Date.getDaysInMonth = function (year, month) {
    return [31, (Date.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
};

Date.prototype.isLeapYear = function () { 
    return Date.isLeapYear(this.getFullYear()); 
};

Date.prototype.getDaysInMonth = function () { 
    return Date.getDaysInMonth(this.getFullYear(), this.getMonth());
};

Date.prototype.addMonths = function (value) {
    var n = this.getDate();
    this.setDate(1);
    this.setMonth(this.getMonth() + value);
    this.setDate(Math.min(n, this.getDaysInMonth()));
    return this;
};

Cela ajoutera la fonction "addMonths()" à n'importe quel objet date en javascript qui devrait gérer les cas limites. Merci à Coolite Inc !

Utilisez :

var myDate = new Date("01/31/2012");
var result1 = myDate.addMonths(1);

var myDate2 = new Date("01/31/2011");
var result2 = myDate2.addMonths(1);

->> newDate.addMonths -> mydate.addMonths

result1 = "29 février 2012"

result2 = "28 février 2011"

8 votes

Est-ce que c'est la seule solution qui prend en compte par exemple ceci : 31 oct. 2011 + 1 ?

1 votes

Il est plus facile, à mon avis, de trouver les jours du mois en retournant une nouvelle date (année, mois+1, 0).getDate() ; Ainsi, la nécessité de isLeapYear() disparaît. Le besoin de méthodes non prototypes n'est pas non plus évident.

0 votes

Intéressant Daniel que vous puissiez mettre un jour 0 pour obtenir le mois précédent.

18voto

Alex Points 21247

Je vous recommande vivement de jeter un coup d'œil à datejs . Grâce à son API, il devient très simple d'ajouter un mois (et de nombreuses autres fonctionnalités de date) :

var one_month_from_your_date = your_date_object.add(1).month();

Ce qui est bien dans datejs c'est qu'il gère les cas limites, car techniquement, vous pouvez le faire en utilisant l'interface native de l'entreprise. Date et les méthodes qui lui sont associées. Mais on finit par s'arracher les cheveux sur les cas limites, ce qui datejs s'est occupée pour vous.

En plus, c'est une source ouverte !

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