如何在今天的三个月之前计算JavaScript的date?

我正在试graphics成一个date,这是在当前date前的3个月。 我通过下面的代码得到当前的月份

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

考虑到当月份是1月份(1),3个月前的date是10月份(10),你们能给我提供计算和形成date( Date数据types的一个对象)的逻辑吗?

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

这个工作在一月份。 运行这个片段:

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

我build议使用名为Moment.js的库。

它经过很好的testing,跨浏览器和服务器端(我在Angular和Node项目中都使用它)。 它对本地date有很大的支持。

http://momentjs.com/

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

.format()返回以ISO 8601格式格式化的date的string表示forms。 你也可以像这样使用自定义的date格式: .format('dddd, MMMM Do YYYY, h:mm:ss a')

为了使事情变得非常简单,您可以使用DateJS(JavaScript的date库):

http://www.datejs.com/

示例代码:

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

这应该处理加/减,只是把一个负值减去一个正值来添加。 这也解决了月份交叉问题。

 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; } 

如果setMonth提供的setMonth方法不是你正在寻找的,请考虑:

 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". 

可以使用任何时间量,只需设置正确的倍数。

已经有一个优雅的答案,但我发现它很难阅读,所以我做了我自己的function。 为了我的目的,我不需要负面的结果,但不难修改。

  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; } 

我喜欢gilly3的答案的简单性,但用户可能会感到惊讶的是,在3月31日之前的一个月是3月3日。我select实施一个月底的版本,所以在3月28日,29日,30日, 31日都是2月28日,那不是闰年。

 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.'); 
 var date=document.getElementById("date"); var d = new Date(); document.write(d + "<br/>"); d.setMonth(d.getMonth() - 6); document.write(d); if(d<date) document.write("lesser then 6 months"); else document.write("greater then 6 months"); 

在我的情况下,我需要减去1个月到当前date。 重要的部分是月份号,所以它不关心你当前月份的哪一天,我需要上个月。 这是我的代码:

 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) 

摘要1个月到实际date这是不准确的,这就是为什么我第一个设置月份的第一天(任何一个月的第一天总是第一天)和第二个地方我减去1天,总是送你到上个月。 希望能帮助你。

 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) 

一个“class轮”(在许多线路上易于阅读))被直接放入一个variables:

 var oneMonthAgo = new Date( new Date().getFullYear(), new Date().getMonth() - 1, new Date().getDate() ); 
 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> 
 var d = new Date(); document.write(d + "<br/>"); d.setMonth(d.getMonth() - 6); document.write(d);