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

g00*_*00b 5 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));
Run Code Online (Sandbox Code Playgroud)

虽然所有日期“看起来”相似,并且如果您使用正常的日/月/年表现相同,但在这种情况下却并非如此。

结果如下:

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)
Run Code Online (Sandbox Code Playgroud)

这对我来说很有趣。我同意最后一个观点,因为JavaScript 规范明确规定了以下内容:

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

我还可以理解第二个和第三个结果,因为这取决于RFC 2822。他们确实接受4*DIGITS年份,因此0000RFC 规范中的年份应该是 0(不过我没有完全阅读它)。

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

但是,我不明白第一个结果。2000年从何而来?我确实知道该日期并不是真正合适的日期,但它不应该返回Invalid Date而不是这个日期吗?

Jam*_*lly 4

这是特定于浏览器的。

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

JavaScript 中的两位数年份 - Chris Bristol

您必须记住,您引用的 RFC 文档于 2001 年 4 月发布。1900 年代才刚刚结束。我猜想,为了使 1900 年代以外的日期现代化,一些浏览器现在将 0 到 49 映射为 2000 到 2049。然而,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 的数据可能已经改变了。