JavaScript的getFullYear()日期方法行为奇怪

3

有人能解释一下为什么getFullYear没有返回2014吗?

console.log(new Date('2014-01-01').getFullYear()) //2013
console.log(new Date('2014-01-01').getUTCFullYear()) //2014

...getMonth() = 11(十二月), ...getDate() = 31(三十一日), ...getDay = 2(星期二) - bloodyKnuckles
2个回答

6

来自MDN

“March 7, 2014” 的 dateString 返回的日期与 “2014-03-07” 不同,除非本地时区是 UTC。当转换“March 7, 2014”的dateString时,假定为本地时区。当转换“2014-03-07”的dateString时,则假定为UTC时区。这会导致根据要转换的字符串格式而异的两个不同的Date值。

因此,当您要解析“2014-01-01”时,您会得到UTC时间。

然后您调用对象的 .getFullYear(),它使用本地时间。如果您像我一样住在美国东部,它基本上会从内部时间中减去4小时并返回年份。

所以这里发生了什么:

  1. "2014-01-01" 被转换为 "1388534400000"
  2. 调用 .getFullYear(),将 "1388534400000" 转换为本地时间
  3. 本地时间类似于 "1388534160000"
  4. 在 "1388534160000" 时刻新年还没有到来,因此仍然是2013年

所有这些都意味着,如果我们做如下操作

console.log(new Date('January 1, 2014').getUTCFullYear()); // 2014
console.log(new Date('January 1, 2014').getFullYear()); // 2014

我们会得到同一年的结果,因为我们告诉浏览器在新年时使用我们的时区,但它们并不等价。
console.log(new Date('January 1, 2014').getUTCHours()); // 5
console.log(new Date('January 1, 2014').getHours()); // 0

回答得好!在我看来,这个回答在详细度和简洁度之间取得了完美的平衡。唯一遗憾的是,MDN的参考文档应该附上链接。感谢您的努力。 - Scott Sauyet
谢谢,非常好的答案! - user1834464
添加了一个到MDN参考的链接。 - Meredith
有趣的是,将一个尾随的空格添加到字符串中会改变结果。 console.log(new Date('2014-01-01 ').getFullYear()) 将得到 2014 - PM 77-1
1
如果字符串不符合该格式,则函数可能会回退到任何特定于实现的启发式或特定于实现的日期格式。我猜Chrome(以及其他浏览器,我没有检查)没有修剪空格,因此它们会回退到默认值。 - Meredith

1
根据this所述: “当您指定格式为YYYY-MM-DD的字符串时,获得的日期是GMT时区的12点,而当您指定格式为DD-MM-YYYY的日期时,获得的日期是当前时区的12点。” 因此,基本上由于您在指定2014年元旦时将其从GMT转换为本地时间,它认为是12-31-13而不是01-01-14。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接