Javascript:日期取决于字段规范顺序?真正地

Javascript:日期取决于字段规范顺序?真正地,javascript,Javascript,为什么这个代码会: var a = new Date(); var b = new Date(); a.setDate(31); a.setMonth(11); a.setFullYear(2009); b.setFullYear(2009); b.setMonth(11); b.setDate(31); 2009年12月31日为b,2009年12月3日为:-O为a?不在浏览器MyhorbleScrap版本6.6.6中,但

为什么这个代码会:

var a = new Date();                             
var b = new Date();     

a.setDate(31);
a.setMonth(11);
a.setFullYear(2009);

b.setFullYear(2009);
b.setMonth(11);
b.setDate(31);

2009年12月31日为b,2009年12月3日为:-O为a?不在浏览器MyhorbleScrap版本6.6.6中,但在FF 3.6和IE 8.06.6001上都是如此,这就是为什么建议使用带参数的构造函数的原因

当您实例化
Date
对象时,它会得到当前日期(今天,2月26日),2月只有28天,当您通过
setDate(31)
设置日期时,它会跳到3月3日

建议的方法是:

var a = new Date(2009, 11, 31);
// new Date(year, month, date [, hour, minute, second, millisecond ]);

我正在练习写蒂姆的答案=/


首先设置年份(因为它可能是闰年),然后设置月份,最后设置日期,但最佳做法是使用构造函数日期(年、月、日),但并不总是希望这样做。

我同意,二月是一个邪恶的月份,但我在十二月设置日期。。。不管怎样,谢谢你的回答。只想添加
Date()
返回今天的日期,这就是为什么现在是二月。如果你在三月份这样做的话,错误就不会出现了。直到你有一个更短的月。丹尼尔:希望我的评论能为你澄清这一点。从Date()开始,它是2月份的今天日期。然后将日期设置为31,实际是3月3日,然后更改月份,现在是2010年12月3日,最后更改年份,得到2009年12月3日。是的,你说得对。我忽略了这样一个事实,即设置单个字段无论如何都必须使对象保持一致的状态,即date。这意味着at总是先指定年份,然后指定月份,然后指定日期,以防止这种可能的不匹配?@Daniel:是的,按照这种顺序进行比较安全,但是如果你知道所有三个数字,那么按照CMS的建议,只需在构造函数中一次指定它们就更简单了。正如我对Daniel说的,设置年份,然后月份和日期在某些情况下无法防止不匹配,例如,假设今天是2009年12月31日,您想将日期设置为2010年2月1日,您更改了年份,一切正常,您现在有2010年12月31日,现在您更改了以2010年2月31日结束的月份,这将产生3月3日,2010年3月1日你是对的,建造师是最“安全”的方式。在所有情况下,我的垃圾到底是什么?