Javascript 新日期()设置为2014年12月31日,改为12月1日

Javascript 新日期()设置为2014年12月31日,改为12月1日,javascript,date,datetime,Javascript,Date,Datetime,我正在尝试将字符串转换为日期对象,它适用于除12月31日以外的所有日期,其中by object表示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) 如果对任何其他日期执行相同操作,则对象将

我正在尝试将字符串转换为日期对象,它适用于除12月31日以外的所有日期,其中by object表示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)
如果对任何其他日期执行相同操作,则对象将返回到适当的值。你知道我做错了什么吗

var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11);
dt.setDate(31);
将值作为整数而不是字符串传递。。它将返回正确的值


更新- 以上描述不正确。。主要的问题是你需要把这三行按正确的顺序排列。。即使在我更正了序列之后,我也忘记更正描述..:P

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

setMonth
的第二个参数也可以用来设置日期

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

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

因此,单独使用
setMonth
setDate
仍然会导致意外的结果

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

例如,如果今天是
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);

问题是,当你先设定一天时,你仍然在当前月份,所以是9月份。9月只有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 */

因为你做的第一件事就是

dt.setDate(31)
这将当前日期设置为31。现在的月份是9月,有30天,所以它已经结束了


如果你要在这一点之后打印出日期,它会显示10月1日。

已经详细解释了这种行为的原因以及如何避免


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

假设您的目的是同时设置年、月和日期,您可以使用:

新日期(年、月、日、时、分、秒、毫秒)

[……]

如果至少提供了两个参数,则缺少的参数为 设置为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
此外,设置日期前一个月仍可能导致意外溢出(建议更改方法顺序的答案不正确):


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

  • setFullYear()
  • setMonth()
  • 设置日期()


我只想指出,首先确定年份也很重要,因为有29年。leapyears中的2月。

你应该将整数传递给setMonth等,而不是字符串。你可以直接使用
日期
构造函数的参数:
新日期(2014,11,31)
顺便说一句,11月不是11月吗?@jnovacho No.@jugheartinen不,日期混淆了,因为现在这个月只有30天。不,这是我在chrome控制台中的测试:var dt=new Date();未定义的dt.设置日期(31);1412157761255 dt.设定月(11);1417431761255 dt.整年(2014年);1417431761255 dt Mon-Dec-01 2014 12:02:41 GMT+0100(巴黎,马德里)它和参数的类型无关,而和序列有关。你提到序列的时候好像它是一个次要的东西…虽然代码可以工作,但你给出了错误的解释,为什么。我刚刚发现了它,确实如此,但它对我们来说没有真正的意义me@user2859409这可能是因为如果不先设置月份,则需要先设置当前月份,然后有时可能会结束到下个月(根据以下Jakub的回答)如果你想把日期设置为9月15日,但今天是8月31日,那么这个日期将一直延续到下个月,最后是10月15日。第二段代码+1:这是更好的方法。我甚至不知道2-argum存在nt形式的
setMonth
。请注意,设置日期之前的月份也可能是错误的。但是,在这种情况下不是这样。如果是10月31日,则setMonth(10)会将日期设置为11月31日,并将其换行为12月1日。setDate(31)会导致12月31日。因此,始终使用2参数setMonth()但我要强调的是,两个月的选择更适合于防止副作用。有趣的是,这只是因为他在一个月内用了30天才尝试过。一个月后,它似乎就可以正常工作了。+1-这种虫子会在整个8月休眠,然后在9月咬你的屁股;)每次为一个部件设置一个日期是不正确的,因为存在以天为先、以月为先的故障案例,并且可能以年为先的故障案例发生在2/29。您必须同时设置这三个字段。+1应该是一个可接受的答案,因为它解释了为什么您应该先设置月份。这是一个非常javascript的WTF,在其他语言中应该是类似的,所以不是“javascript WTF”。当设置了错误的日期时,为什么Date对象不抛出?我想它是用来对接受的答案进行评论的?不是真的。这是对“我做错了什么?”问题的回答。不。订单不能保证日期设置正确。请参阅下面被接受和投票最多的答案的评论。如果您的开始日期是31日,并且您将其设置为少于30天的月份,那么您将在下个月结束。所以这还不够。为了安全起见,您应该将日期设置为不高于
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