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