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"
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.
0 votes
@Alnitak : Non mon cher, il ne commencera qu'avec le 1er jour du mois.
0 votes
Alors vous auriez dû le dire....
0 votes
Je suggère d'ajouter des jours au lieu de mois. Si vous ajoutez un mois au 30.01.2011, quel serait le résultat ? 30.02.2011 ? 02.03.2011 ?
0 votes
@Alnitak : J'ai déjà maintenu cela dans ma question...
0 votes
Non, tu ne l'as pas fait. Le fait que les dates de votre question soient toutes le 1er serait pris par la plupart comme un exemple et non un contrainte . Vous l'avez même dit : "Par exemple :".
0 votes
Var month = new Date(someDate).getMonth() + 1 ;
0 votes
Je viens de rencontrer ce problème aujourd'hui, dans le cas où le jour de la date est compris entre 1 et 28 (où nous savons avec certitude que le mois suivant a ces jours), vous pouvez simplement utiliser
setMonth(currentMonth + 1)
sinon utiliser Luxon ou tout autreDate
remplacement parce que cela ne fonctionnera pas autrement (à moins que vous ne fassiez du parsing sur le backend, parce que les dates basées sur le mois zéro de JS vont vous foutre dans la merde).