use*_*409 80 javascript datetime date
我正在尝试将字符串转换为Date对象,并且它适用于除12月31日之外的所有日期,其中对象表示12月1日而不是31日.我不知道为什么.这是我的JavaScript代码:
var dt = new Date();
dt.setDate("31");
dt.setMonth("11");
dt.setFullYear("2014");
Run Code Online (Sandbox Code Playgroud)
但我的变量值是:
Mon Dec 01 2014 11:48:08 GMT+0100 (Paris, Madrid)
Run Code Online (Sandbox Code Playgroud)
如果我对任何其他日期执行相同操作,则我的对象将返回到适当的值.你知道我做错了什么吗?
Jak*_*lek 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 */
Run Code Online (Sandbox Code Playgroud)
xda*_*azz 84
:( 少于31天的月份不安全)setMonth 应该在之前 setDate
var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11);
dt.setDate(31);
Run Code Online (Sandbox Code Playgroud)
并且setMonth第二个参数也可用于设定日期.
var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11, 31);
Run Code Online (Sandbox Code Playgroud)
因此,单独使用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 */
Run Code Online (Sandbox Code Playgroud)
要避免这种情况,请直接使用构造函数设置值.
var dt = new Date(2014, 11, 31);
Run Code Online (Sandbox Code Playgroud)
fun*_*bro 23
这是因为你做的第一件事就是
dt.setDate(31)
Run Code Online (Sandbox Code Playgroud)
这将当前日期设置为31.当前月份是9月,有30天,所以它将它包裹起来.
如果你打印出这一点之后的日期,那就是10月1日.
Sal*_*n A 13
假设您的意图是同时设置年,月和日期,您可以使用更长的日期构造函数:
新日期(年,月,日,小时,分钟,秒,毫秒);
[...]
如果提供了至少两个参数,则缺少的参数要么设置为1(如果缺少一天),要么设置为0.
所以你会写:
var dt = new Date(2014, 11, 31);
Run Code Online (Sandbox Code Playgroud)
如已经建立的那样,一次设置一部分日期可能会导致溢出:
var dt = new Date(2012, 1, 29); // Feb 29 2012
dt.setFullYear(2014); // Mar 01 2014 instead of Feb 28 2014
Run Code Online (Sandbox Code Playgroud)
此外,在日期之前设置仍然可能导致意外溢出(建议更改方法顺序的答案不正确):
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
Run Code Online (Sandbox Code Playgroud)
行为的原因以及如何避免这种行为已得到充分解释.
但是代码中的真正错误是你不应该使用默认构造函数:new Date().您的代码将导致12月13日的日期与当前时间.我怀疑这是你想要的.您应该使用以年,月和日为参数的Date构造函数.
| 归档时间: |
|
| 查看次数: |
12001 次 |
| 最近记录: |