(new Date('2012-12-01')).getMonth()
是10
而不是11
(getMonth
为0索引(。我已经在Firefox、Chrome和Node.js上测试过了。为什么会发生这种情况?
您遇到时区问题。JS引擎将字符串解释为UTC,因为没有进一步指定它。根据Date.parse
(new Date
使用(的规范:
根据字符串的内容,字符串可以被解释为本地时间、UTC时间或其他时区的时间。函数首先尝试根据日期-时间字符串格式(15.9.1.15(中调用的规则解析字符串的格式。如果字符串不符合该格式,则函数可能会返回到任何特定于实现的启发式方法或特定于实施的日期格式。
在您的时区中,日期时间是11月的Nov 30 2012 19:00:00 GMT-0500
。使用.getUTCMonth()
,您将获得十二月。但是,千万不要相信Date.parse
,每个浏览器的操作方式都不同。因此,如果您不在Node.js这样的受限环境中,那么您应该始终解析字符串(例如使用regex(并将其提供给new Date(Date.UTC(year, month, date, …))
。
至少在Firefox的情况下,RFC2822规定日期规范必须用折叠空白分隔。尝试(new Date('2012 12 01')).getMonth();
似乎未定义使用-
作为分隔符。
错误是由于在第01天前面加了0。不确定这是为什么,但如果你去掉1之前的0,它会给你一个合适的月份(11(。
此外,如果这意味着什么的话,它会在10月份开始给出错误的月份。
短期修复,使用1而不是01。