Javascript (新日期(';2012-12-01';)。getMonth()==10?

Javascript (新日期(';2012-12-01';)。getMonth()==10?,javascript,date,datetime,Javascript,Date,Datetime,(新日期('2012-12-01'))。getMonth()是10而不是11(getMonth是0索引)。我已经在Firefox、Chrome和Node.js上进行了测试。为什么会发生这种情况?错误是由于在第01天的前面加上0而引起的。不知道为什么会这样,但是如果你在1之前去掉零,它会给你正确的月份(11) 此外,如果这意味着什么的话,它在10月份开始给出错误的月份 短期修复,使用1代替01。至少对于必须用分隔符分隔的状态。尝试(新日期('2012 12 01')).getMonth()未定义将

(新日期('2012-12-01'))。getMonth()是
10
而不是
11
getMonth
是0索引)。我已经在Firefox、Chrome和Node.js上进行了测试。为什么会发生这种情况?

错误是由于在第01天的前面加上0而引起的。不知道为什么会这样,但是如果你在1之前去掉零,它会给你正确的月份(11)

此外,如果这意味着什么的话,它在10月份开始给出错误的月份


短期修复,使用1代替01。

至少对于必须用分隔符分隔的状态。尝试
(新日期('2012 12 01')).getMonth()未定义将
-
用作分隔符。

您遇到了时区问题。JS引擎将字符串解释为UTC,因为它没有进一步指定。来自(由使用的):

根据字符串的内容,字符串可以解释为本地时间、UTC时间或其他时区的时间。函数首先尝试根据日期时间字符串格式()中调用的规则解析字符串的格式。如果字符串不符合该格式,函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式


在您的时区中,日期时间为2012年11月30日19:00:00 GMT-0500
——11月。使用,你将得到十二月。但是,千万不要相信日期。解析,每个浏览器的操作都不一样。因此,如果您不在Node.js这样的受限环境中,您应该始终解析字符串(例如,使用正则表达式),并将其馈送到
新日期(Date.UTC(year,month,Date,…)

当我在FF中尝试它时,它返回了11(如预期的那样)。你在用哪个浏览器?@nnnnnn我不知道该告诉你什么。这在Chrome、Firefox和Node.js中发生;谢谢你的澄清。我在下面给出了我的答案。做一个
console.log(新日期('2012-12-01'))
。这是什么?@MindVirus:那么这是一个时区问题(至少在浏览器中,不确定node.js服务器的时区)。不要为我使用。我得到的是
NaN
,而不是
11
。没有说明
新日期将使用RGC2822的规范。例如,Opera将其正确解析为
Sat Dec 01 2012 01:00:00 GMT+0100
我认为-定义为。。。因为减号运算符12-01是11月。我的RFC2822的来源是。看看这个,它表明。非常奇怪的是,如果是这样的话,会出现减法运算。可能前导零会将其强制转换为整数。是一种简化的ISO8601格式,与RFC2822无关。也许FF会退回到类似RFC2822的日期格式,但我不希望它允许折叠空格(带注释!)我同意,总体而言,使用离散输入构建日期对象比使用解析机制更好,因为解析机制在不同的情况下可能表现不同。实际上,我认为规范非常明确。第15.9.1.15节说:“缺少时区偏移的值是“Z”。(所以Chrome是正确的,Firefox是错误的)。好的,更正。看起来像是a-目的是匹配ISO-8601,其中缺少Z表示本地时间(因此Chrome匹配ES5.1,Firefox和IE匹配ISO-8601)