我遇到了一些奇怪的行为,虽然我真的没有问题,但我想知道背后的原因。
我写了以下陈述:
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
代替这个日期吗?
答案 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日。
您必须记住,您引用的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的数据可能已经改变了。