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

时间:2014-06-05 19:48:31

标签: javascript

任何人都可以解释为什么getFullYear不会返回2014年?

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

2 个答案:

答案 0 :(得分:5)

来自MDN

  

" 2014年3月7日"的dateString;返回与" 2014-03-07"不同的日期除非本地时区是UTC。转换" 2014年3月7日"的dateString时假设当地时区。转换" 2014-03-07"的dateString时假定为UTC时区。这会产生两个不同的Date值,具体取决于要转换的字符串的格式。

因此,当您要求它解析" 2014-01-01"时,您将获得UTC时间。

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

所以发生了什么:

  1. " 2014年1月1日"转换为" 1388534400000"
  2. .getFullYear()被称为" 1388534400000"转换为当地时间
  3. 当地时间类似于" 1388534160000"
  4. 新年尚未发生在" 1388534160000",所以它仍然是2013
  5. 所有这些都意味着,如果我们做类似

    的事情
    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
    

答案 1 :(得分:1)

根据this: "不同之处在于,当您以YYYY-MM-DD格式指定字符串时,您将获得格林尼治标准时区时区的日期,并且当您以DD-MM-YYYY格式指定日期时,您将获得日期是当前时区的上午12点。"

所以基本上因为你指定2014年新闻年,当它从格林威治标准时间转换到你当地时间时它认为它是12-31-13而不是01-01-14。