为什么JavaScript将1/1/0000解释为1/1/2000?

时间:2015-08-14 09:49:07

标签: javascript date

我遇到了一些奇怪的行为,虽然我真的没有问题,但我想知道背后的原因。

我写了以下陈述:

console.log(new Date("0000-1-1"));
console.log(new Date("0000-01-01"));
console.log(new Date("0000-01-01T00:00:00Z"));
console.log(new Date(0, 0, 1));

所有日期"出现"相似,如果你使用正常的日/月/年表现相同,在这种情况下则不然。

结果如下:

Sat Jan 01 2000 00:00:00 GMT+0100 (CET)
Sat Jan 01 0 01:00:00 GMT+0100 (CET)
Sat Jan 01 0 01:00:00 GMT+0100 (CET)
Mon Jan 01 1900 00:00:00 GMT+0100 (CET)

这对我很有意思。我同意最后一个,因为JavaScript spec清楚地说明了以下内容:

  

     

表示年份的整数值。从0到99的值映射到1900年到1999年。请参见下面的示例。

我也可以理解第二和第三个结果,因为这取决于RFC 2822。他们确实接受4*DIGITS作为一年,所以0000应该是RFC规范的第0年(尽管我还没有读完)。

Date构造函数中的一个可以用于1900以上的日期,而另一个构造函数允许更广范围的日期(RFC),这有点奇怪。

但是,我不明白第一个结果。 2000年从哪里来?我确实理解日期并不是真正合适的日期,但是它不应该返回Invalid Date代替这个日期吗?

1 个答案:

答案 0 :(得分:3)

这是特定于浏览器的。

  

这是JavaScript和浏览器不一致导致额外程序员痛苦的另一个领域。有些浏览器将所有两位数年份解释为19xx,因此new Date('1/1/49')给出1949年1月1日,new Date('1/1/50')给出1950年1月1日。其他浏览器使用1950作为"两位数年份截止日期&# 34;,所以new Date('1/1/49')给出了2049年1月1日,new Date('1/1/50')给出了1950年1月1日。

     

- Two Digit Years in JavaScript - Chris Bristol

您必须记住,您引用的RFC文档于2001年4月发布.20世纪初刚刚结束。我想在尝试对20世纪20年代的日期进行现代化改造时,现在有些浏览器在2000年到2049年之间映射0到49.但是,50仍然会映射到1950年。

上面引用的文章还提供了一些测试结果:

  

以下是结果的简要总结:

     
      
  • IE9:找不到两位数年份截止日期。 00年= 1900年。
  •   
  • Chrome 24.0:两位数年份在49到50之间变化。年份00 = 2000。
  •   
  • Opera:找不到两位数年份的截止日期。 00年= 1900年。
  •   
  • Firefox:找不到两位数年份截止日期。 00年= 1900年。
  •   
  • Safari:两位数年份在49到50之间变化。年份00 = 2000年。
  •   

这篇文章现在已经过时了,所以我想上面的Opera和Firefox的数据可能已经改变了。