Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 二月十五日不是';找不到_Javascript_Date - Fatal编程技术网

Javascript 二月十五日不是';找不到

Javascript 二月十五日不是';找不到,javascript,date,Javascript,Date,我使用javascript,在控制台中运行这个 d = new Date(); d.setMonth(1); d.setFullYear(2009); d.setDate(15); d.toString(); 输出如下: "Sun Mar 15 2009 18:05:46 GMT-0400 (EDT)" 为什么会发生这种情况?这似乎是一个浏览器错误 d = new Date(); d.setDate

我使用javascript,在控制台中运行这个

d = new Date();             
d.setMonth(1);
d.setFullYear(2009);
d.setDate(15);                                  
d.toString();
输出如下:

"Sun Mar 15 2009 18:05:46 GMT-0400 (EDT)"
为什么会发生这种情况?这似乎是一个浏览器错误

d = new Date();
d.setDate(15);                    
d.setMonth(1);
d.setFullYear(2009);                                                                 
d.toString();

这是可行的。

这是因为当你初始化一个新日期时,它与今天的日期一起出现,所以今天是2008年10月30日,然后你将月份设置为2月,因此没有2月30日,所以先设置日期,然后设置月份,然后设置年份:

d = new Date();
d.setDate(15);                    
d.setMonth(1);
d.setFullYear(2009);   
但正如所说,最好使用日期构造函数:

new Date(year, month, date [, hour, minute, second, millisecond ]);

最好一步构造一个日期对象,以避免日期对象处于不明确或无效状态:

d = new Date(2009, 1, 15);

在使用Firebug在XP上进行了一系列FF3测试之后,我可以告诉您以下几点

  • 在调用Date.setMonth()之后调用Date.setDate()将生成这种奇怪的行为
  • Date.setMonth()强制时区为CST(或某些不支持DST的区域)
  • setDate()强制时区为CDT(或某些支持DST的时区)
因此,就时区而言,setMonth()和setDate()确实存在一些不可靠的地方


我能提供的唯一解决方案是:在设置月份之前设置日期。

这通常可以避免javascript日期API的错误:

d.setDate(1);
d.setFullYear(year);
d.setMonth(month);
d.setDate(day);
给定年+月+日为“有效”组合,例如,使用getFullYear()、getMonth()、getDate()从另一个日期对象获取

重要的部分是:

  • setDate(1)
    开始,以避免当前日期值为29、30或31时可能出现的滚动
  • setDate(day)
    之前调用
    setMonth(month)
    ,以避免在当前月份值“有问题”的情况下发生相同的滚动(因为初始
    setDate(1)
    将无效)

在您最初的问题中,将月份设置为“第一”会导致问题,因为今天是30号,2月30号不存在,所以Javascript为您调整了日期。想想看,如果你几天前写过这段代码,它可能会工作得很好。你今天真幸运!为什么不像Jason W提到的那样一步一个脚印地完成呢?我最终就是这么做的,我一发现问题所在就发布了这篇文章。如果现在是二月,你叫d.setDate(30)?只要是双闰年,一切都很好。如果这一年不是闰年,那么二月有28天,应该给你3月2日,如果是闰年,3月1日CMS:我认为你没有抓住重点。如果d.setDate(30)将日期设置为3月2日(或1日,随便什么),然后d.setMonth(0)将日期设置为1月,那么最终的结果将是1月2日,而不是1月30日。是的,我注意到,我认为最好使用Jason所说的构造函数初始化日期,新日期(年、月、日[、小时、分钟、秒、毫秒])不可以。如果您将日期设置在月份之前,则当当前日期对象为“2012-04-15”且您希望转到“2012-03-31”时,它将不起作用,因为将日期设置为“31”和“4月”将移动到5月1日,然后再将月份设置为“2012-03-01”。您需要先调用setDate(1),然后是year,然后是month,然后是date。