新的date()设置为2014年12月31日说,而不是12月1日

我试图将一个string转换为一个Date对象,除了12月31日对象说12月1日而不是31日之外,它适用于所有日子。 我不知道为什么。 这是我的JavaScript代码:

 var dt = new Date(); dt.setDate("31"); dt.setMonth("11"); dt.setFullYear("2014"); 

但我的variables值是:

 Mon Dec 01 2014 11:48:08 GMT+0100 (Paris, Madrid) 

如果我对其他date做同样的事情,我的对象会返回适当的值。 你有什么想法我做错了吗?

setMonth应该在setDate之前 🙁 不安全的月份less于31天

 var dt = new Date(); dt.setFullYear(2014); dt.setMonth(11); dt.setDate(31); 

setMonth的第二个参数也可以用来设置date。

 var dt = new Date(); dt.setFullYear(2014); dt.setMonth(11, 31); 

如果没有为构造函数提供参数,则会根据系统设置使用当前的date和时间

因此,分别使用setMonthsetDate仍然会导致意外的结果。

如果设置的值大于其逻辑范围 ,则该值将自动调整为相邻值

例如,如果今天是2014-09-30 ,那么

 var dt = new Date(); dt.setFullYear(2014); /* Sep 30 2014 */ dt.setMonth(1); /* Mar 02 2014, see, here the auto adjustment occurs! */ dt.setDate(28); /* Mar 28 2014 */ 

为避免这种情况,请直接使用构造函数设置值。

 var dt = new Date(2014, 11, 31); 

事情是,当你先设定一天的时候,你现在还在九月。 九月只有三十天如此:

 var dt = new Date(); /* today */ dt.setDate("31"); /* 1st Oct 2014 as should be by spec */ dt.setMonth("11"); /* 1st Dec 2014 */ dt.setFullYear("2014"); /* 1st Dec 2014 */ 

这是因为你做的第一件事是

 dt.setDate(31) 

这将当前date设置为31.当前月份是9月份,有30天,所以它正在包装它。

如果你打印出这一点之后的date,那就是10月1日。

假设你的意图是同时设置年份,月份和date,你可以使用更长的date构造函数 :

新date(年,月,日,时,分,秒,毫秒);

[…]

如果至less提供了两个参数,缺less的参数要么设置为1(如果缺less一天),要么设置为0。

所以你会写:

 var dt = new Date(2014, 11, 31); 

如已经确定的那样,一次设置一部分date可能导致溢出:

 var dt = new Date(2012, 1, 29); // Feb 29 2012 dt.setFullYear(2014); // Mar 01 2014 instead of Feb 28 2014 

而且,设置月份之前的date仍然会导致意外溢出(build议更改方法顺序的答案不正确):

 var dt = new Date(2014, 0, 31); // Jan 31 2014 dt.setFullYear(2014); // Jan 31 2014 dt.setMonth(1); // Mar 03 2014 instead of Feb 28 2014 dt.setDate(1); // Mar 01 2014 

这个行为的原因以及如何避免它已经被充分解释了。

但是在你的代码中真正的错误是你不应该使用默认的构造函数:new Date()。 您的代码将在12月13日与当前时间产生一个date。 我怀疑这是你想要的。 您应该使用以年,月和日作为参数的Date构造函数。

答案表明,设定date的正确顺序是:

  • 调用setFullYear()
  • setMonth()
  • 设置date()

我只想指出,因为闰年​​的29二月,所以首先设定年度也很重要。

 var dt = new Date(); dt.setFullYear(2014); dt.setMonth(11); dt.setDate(31); 

传递值为整数不是string..它会返回正确的值..


更新 – 上面的描述是不正确的..主要的问题是你需要把这三条线以正确的顺序。即使我纠正了序列后,我忘记纠正描述..:P