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

时间:2014-09-09 09:55:16

标签: javascript date datetime

我正在尝试将字符串转换为Date对象,并且它适用于除12月31日之外的所有日期,其中对象表示12月1日而不是31日。我不知道为什么。这是我的JavaScript代码:

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

但我的变量值是:

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

如果我对任何其他日期执行相同操作,我的对象将返回适当的值。你知道我做错了什么吗?

7 个答案:

答案 0 :(得分:120)

问题是,当你先设定一天时,你仍然在当月,所以九月。九月只有30天所以:

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 */

答案 1 :(得分:84)

setMonth应该在setDate 之前:( 对于少于31天的月份不安全

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

并且setMonth的第二个参数也可用于设置日期。

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

<小时/> 如果没有为构造函数提供参数,它将根据系统设置使用当前日期和时间

因此,单独使用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);

答案 2 :(得分:23)

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

dt.setDate(31)

这会将当前日期设置为31.当前月份是9月,有30天,所以它将它包裹起来。

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

答案 3 :(得分:13)

假设您的意图是同时设置年,月和日期,您可以使用longer date constructor

  

新日期(年,月,日,小时,分钟,秒,毫秒);

     

[...]

     

如果提供了至少两个参数,则缺少参数   设置为1(如果缺少一天)或0设置为所有其他。

所以你会写:

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

如前所述,一次设置一部分日期可能会导致溢出:

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

此外,在日期之前设置仍然可能导致意外溢出(建议更改方法顺序的答案不正确):

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

答案 4 :(得分:7)

行为的原因以及如何避免这种行为已得到充分解释。

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

答案 5 :(得分:-1)

答案清楚地表明,设定日期的正确顺序是:

  • 调用setFullYear()
  • setMonth()
  • 的setDate()

我只是想指出,由于2月29日在闰年,首先设定年份也很重要。

答案 6 :(得分:-3)

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

将值作为整数而非字符串传递..它将返回正确的值..


更新 - 以上描述不正确..主要问题是你需要将这三行按正确的顺序排列..即使我纠正了序列后我忘了纠正说明..:P