我正在尝试将字符串转换为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)
如果我对任何其他日期执行相同操作,我的对象将返回适当的值。你知道我做错了什么吗?
答案 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)
之前:( 对于少于31天的月份不安全)setMonth
应该在setDate
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);
<小时/> 如果没有为构造函数提供参数,它将根据系统设置使用当前日期和时间。
因此,单独使用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);
答案 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)
答案清楚地表明,设定日期的正确顺序是:
我只是想指出,由于2月29日在闰年,首先设定年份也很重要。
答案 6 :(得分:-3)
var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11);
dt.setDate(31);
将值作为整数而非字符串传递..它将返回正确的值..
更新 - 以上描述不正确..主要问题是你需要将这三行按正确的顺序排列..即使我纠正了序列后我忘了纠正说明..:P