Javascript getFullYear() Date方法的怪异行为

Javascript getFullYear() Date method weird behavior

本文关键字:方法 getFullYear Date Javascript      更新时间:2023-09-26

谁能解释为什么getFullYear不返回2014?

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

From MDN:

"March 7, 2014"的dateString返回与"2014-03-07"不同的日期,除非当地时区是UTC。当转换dateString为"March 7, 2014"时,假定为本地时区。当转换dateString "2014-03-07"时,假定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

据此:"不同之处在于,当你以YYYY-MM-DD格式指定一个字符串时,你得到的日期是GMT时区的12点,而当你以DD-MM-YYYY格式指定一个日期时,你得到的日期是当前时区的12点。"

所以基本上,因为你指定的是新闻年月日2014,当它从GMT转换到你的本地时间时,它认为它是12-31-13而不是01-01-14。