javascript Date()求和日,但不求月

javascript Date()求和日,但不求月,javascript,date,Javascript,Date,我想在Date()对象中求和30天,我使用javascriptDate()并使用.setDate(.getDate()+30)设置新日期,当您使用console.log()打印它时,它似乎已经更新了月份,但当我尝试获取值时 var myDate = new Date(); myDate.setDate( myDate.getDate() + 30 ); console.log( myDate ); // will show 1 month ahead console.log( "Next

我想在
Date()
对象中求和30天,我使用javascript
Date()
并使用
.setDate(.getDate()+30)
设置新日期,当您使用
console.log()
打印它时,它似乎已经更新了月份,但当我尝试获取值时

var myDate = new Date();

myDate.setDate( myDate.getDate() + 30 ); 

console.log( myDate ); // will show 1 month ahead
console.log( "Next Month (wrong): " + myDate.getMonth() ); // will thow this month! why???

var dateData = {
  'day':(myDate.getDate() < 10) ? "0" + myDate.getDate() : myDate.getDate(),
  'month':(myDate.getMonth() < 10) ? "0" + myDate.getMonth() : myDate.getMonth(),
  'year':myDate.getFullYear()
} ;

console.log( dateData.year + "-" + dateData.month + "-" + dateData.day ) ;
// it sum date but not month

怎么了?这是javascript错误还是程序员混乱?

这是正确的。JavaScript根据基于0的索引计算月份。0=一月,1=二月,等等。九月是第8个月,而不是第9个月,因此您的代码是正确的

试试这个:

console.log(new Date().getMonth()); // During August, will be 7

请参阅:

该函数返回0到11之间的值。

因此,这是一个程序员的错误。感谢亚当的回答是正确的,但另一方面。。。不要改变日期对象。别这样。做一个新的。帮你自己一个忙,假装约会没有定位符。我同意@JaredSmith。你最好使用像@JaredSmith这样的库——我认为这根本不是什么好建议,你需要用合理的论据来支持这样的断言。@RobG我以前从未听过有人对日期表达相反的立场。我的论点是:1。在99.99%的情况下,仅仅制作一个新的,并没有真正的性能影响。2.从概念上讲,日期是一个值:2017年8月29日星期二07:21:38始终是2017年8月29日星期二07:21:38,就像数字5始终是5一样。我不是一个坚持fp的人,我会说所有的变异总是不好的,但我们不再使用可变字符串编程,即使它们是
char*
(或unicode pts),我认为变异日期不必要地复杂。@JaredSmith-1和“买这辆车,它几乎和另一辆车一样快,因此它更好。”2是不相关的。给定日期d,你建议
新日期(d.getFullYear(),d.getMonth(),d.getDate()+1)
d.setDate(d.getDate()+1)更可取
。如果变异不好,那么加入TC39委员会,删除赋值操作符,如
+=
*=
,等等;-)这与现有的答案不同……如何?它甚至链接到相同的文档。这很公平。我在发布之前没有发现答案。
console.log(new Date().getMonth()); // During August, will be 7