Comment calculer la date en JavaScript trois mois avant aujourd'hui?

J'essaie de créer une date de 3 mois avant la date actuelle. Je reçois le mois courant par le code ci-dessous

var currentDate = new Date(); var currentMonth = currentDate.getMonth()+1; 

Pouvez-vous me fournir la logique de calculer et de former une date (un objet du type de données Date ) étant donné que lorsque le mois est janvier (1), 3 mois avant la date serait OCtober (10)?

 var d = new Date(); d.setMonth(d.getMonth() - 3); 

Cela fonctionne pour janvier. Exécutez cet extrait:

 var d = new Date("2012-01-15"); document.write(d + "<br/>"); d.setMonth(d.getMonth() - 3); document.write(d); 

Je recommande d'utiliser une bibliothèque appelée Moment.js.

Il est bien testé, fonctionne avec un navigateur croisé et côté serveur (je l'utilise à la fois dans les projets Angulaires et Nœuds). Il est très utile pour les dates locales.

http://momentjs.com/

 var threeMonthsAgo = moment().subtract(3, 'months'); console.log(threeMonthsAgo.format()); // 2015-10-13T09:37:35+02:00 

.format() renvoie la représentation de la chaîne de la date formatée au format ISO 8601 . Vous pouvez également l'utiliser avec un format de date personnalisé comme ceci: .format('dddd, MMMM Do YYYY, h:mm:ss a')

Pour rendre les choses vraiment simples, vous pouvez utiliser DateJS, une bibliothèque de dates pour JavaScript:

http://www.datejs.com/

Exemple de code pour vous:

 Date.today().add({ months: -1 }); 

Cela devrait traiter l'addition / soustraction, il suffit de mettre une valeur négative pour soustraire et une valeur positive à ajouter. Cela résout également le problème de croisement du mois.

 function monthAdd(date, month) { var temp = date; temp = new Date(date.getFullYear(), date.getMonth(), 1); temp.setMonth(temp.getMonth() + (month + 1)); temp.setDate(temp.getDate() - 1); if (date.getDate() < temp.getDate()) { temp.setDate(date.getDate()); } return temp; } 

Si la méthode setMonth offerte par gilly3 n'est pas ce que vous recherchez, considérez:

 var someDate = new Date(); // add arguments as needed someDate.setTime(someDate.getTime() - 3*28*24*60*60); // assumes the definition of "one month" to be "four weeks". 

Peut être utilisé pendant un certain temps, il suffit de régler les multiples appropriés.

Il y a déjà une réponse élégante, mais je trouve que c'est difficile à lire, donc j'ai fait ma propre fonction. Pour mes besoins, je n'avais pas besoin d'un résultat négatif, mais il ne serait pas difficile de modifier.

  var subtractMonths = function (date1,date2) { if (date1-date2 <=0) { return 0; } var monthCount = 0; while (date1 > date2){ monthCount++; date1.setMonth(date1.getMonth() -1); } return monthCount; } 

J'aime la simplicité de la réponse de gilly3 , mais les utilisateurs seront probablement surpris qu'un mois avant le 31 mars soit le 3 mars. J'ai choisi de mettre en œuvre une version qui s'arrête jusqu'à la fin du mois, donc un mois avant le 28, 29, 30 mars, Et 31 seront tous le 28 février, ce n'est pas une année bissextile.

 function addMonths(date, months) { var result = new Date(date), expectedMonth = ((date.getMonth() + months) % 12 + 12) % 12; result.setMonth(result.getMonth() + months); if (result.getMonth() !== expectedMonth) { result.setDate(0); } return result; } var dt2004_05_31 = new Date("2004-05-31 0:00"), dt2001_05_31 = new Date("2001-05-31 0:00"), dt2001_03_31 = new Date("2001-03-31 0:00"), dt2001_02_28 = new Date("2001-02-28 0:00"), result = addMonths(dt2001_05_31, -2); console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString()); result = addMonths(dt2001_05_31, -3); console.assert(dt2001_02_28.getTime() == result.getTime(), result.toDateString()); result = addMonths(dt2001_05_31, 36); console.assert(dt2004_05_31.getTime() == result.getTime(), result.toDateString()); result = addMonths(dt2004_05_31, -38); console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString()); console.log('Done.'); 
 Following code give me Just Previous Month From Current Month even the date is 31/30 of current date and last month is 30/29/28 days: <!DOCTYPE html> <html> <body> <p>Click the button to display the date after changing the month.</p> <button onclick="myFunction()">Try it</button> <p id="demo"></p> <script> function myFunction() { var d = new Date("March 29, 2017"); // Please Try the result also for "March 31, 2017" Or "March 30, 2017" var OneMonthBefore =new Date(d); OneMonthBefore.setMonth(d.getMonth(),0); if(OneMonthBefore.getDate() < d.getDate() ) { d.setMonth(d.getMonth(),0); }else { d.setMonth(d.getMonth()-1); } document.getElementById("demo").innerHTML = d; } </script> </body> </html> 

Dans mon cas, je devais soustraire 1 mois à la date actuelle. La partie importante était le numéro du mois, donc cela ne se soucie pas du jour de votre mois actuel, j'avais besoin du mois dernier. C'est mon code:

 var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART) dateObj.setDate(1); //Set first day of the month from current date dateObj.setDate(-1); // Substract 1 day to the first day of the month //Now, you are in the last month console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART) 

Restez 1 mois à la date réelle, ce n'est pas précis, c'est pourquoi, en premier lieu, je mets le premier jour du mois (le premier jour de tout mois est toujours le premier jour) et, en deuxième lieu, je supprime 1 jour, qui vous envoie toujours au mois dernier. J'espère vous aider mec.

 var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART) dateObj.setDate(1); //Set first day of the month from current date dateObj.setDate(-1); // Substract 1 day to the first day of the month //Now, you are in the last month console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART) 

Un "one liner" (sur plusieurs lignes pour faciliter la lecture)) doit être directement placé dans une variable:

 var oneMonthAgo = new Date( new Date().getFullYear(), new Date().getMonth() - 1, new Date().getDate() );