为什么Javascript getYear()返回108?

为什么这个JavaScript返回108而不是2008? 它得到的date和月份正确,但不是一年?

myDate = new Date(); year = myDate.getYear(); 

年= 108?

这是2000年的事情,只有1900年以后才算。

现在有一些潜在的兼容性问题, getYear()已经被弃用,取而代之的是getFullYear() – 来自quirksmode :

为了使事情变得更加复杂,date.getYear()现在已经被弃用了,你应该使用date.getFullYear(),而旧版本的浏览器不支持。 然而,如果它有效,它应该总是给全年,即。 2000而不是100。

您的浏览器提供以下两种方法:

 * The year according to getYear(): 108 * The year according to getFullYear(): 2008 

Internet Explorer和Firefox之间也存在实现差异,因为IE的getYear()实现更改为像getFullYear() – 来自IBM :

根据ECMAScript规范,getYear返回年份减去1900,最初意味着为1998返回“98”。getYear在ECMAScript版本3中被弃用,并被getFullYear()取代。

Internet Explorer将getYear()更改为像getFullYear()一样工作,并使其与Y2k兼容,而Mozilla保持标准的行为。

由于getFullYear在旧版浏览器中不起作用,因此可以使用如下所示的内容:

 Date.prototype.getRealYear = function() { if(this.getFullYear) return this.getFullYear(); else return this.getYear() + 1900; }; 

Javascript原型可以用来扩展现有的对象,很像C#扩展方法。 现在,我们可以做到这一点,

 var myDate = new Date(); myDate.getRealYear(); // Outputs 2008 

检查文档。 这不是千年虫问题 – 这是缺乏千年虫问题! 这个决定最初是用C编写的,被复制到Perl中,显然是JavaScript,可能还有其他几种语言。 很久以前,使用两位数年份显然还是可取的,但是devise这个接口的人有足够的预见意识到他们需要考虑2000年及以后会发生什么事情,所以不要只提供最后两个数字,他们提供了自1900年以来的年数。如果您匆忙或想冒险,可以使用两位数字。 或者如果你想让你的程序继续工作,你可以增加100个结果,并使用全面的四位数年份。

我记得我第一次在Perl中进行date操作。 奇怪的是我读了文档 。 显然这不是一件普通的事情。 一两年后,我于1999年12月31日被调到办公室,修复了一些合同Perl代码中最后一刻发现的错误,这些东西我从来没有任何关系。 这是一个确切的问题:自1900年以来,标准date调用返回,程序员将其视为两位数的年份。 (他们认为他们在2000年会得到“00”)作为一个没有经验的年轻程序员,这让我觉得我们为了一份“专业”工作付出了额外的代价,而那些人甚至没有打扰过文档。 这是多年幻灭的开始; 现在我老了,玩世不恭。 🙂

在2000年,YAPC年度Perl会议被称为“YAPC 19100”,以纪念这个经常被报道的非bug。

现在,至less在Perl世界中,使用标准模块进行date处理更合理,而使用真正的四位数年份。 不知道什么可用于JavaScript。

它必须返回自1900年以来的年数。

使用date.getFullYear()

这(正如其他地方所指出的)是千年虫的事情。 Netscape(2000年以前编写)最初返回,例如getYear() 98 。 而不是返回到00 ,而是2000年返回100然后其他浏览器来了,做了不同的事情,每个人都不满,因为不兼容。

后来的浏览器支持getFullYear作为返回完整年份的标准方法。

正如指出的那样,您应该从不使用getYear() ,而是使用getFullYear()

然而,这个故事并不像IE那样以getFullYear()实现GetYear() ,Opera和IE这几天把getYear()当作getYear()最初是为2000年之前的date指定的,但是将其视为getFullYear() 2000年以后,而webkit和Firefox则坚持旧的行为

这在所有浏览器中输出99:

 javascript:alert(new Date(917823600000).getYear()); 

这在FF / WebKit中输出108,在Opera / IE中输出为2008:

 javascript:alert(new Date().getYear()); 

这是愚蠢的。 它的历史可以追溯到2000年以前 ,现在只是因为遗留原因而返回1900年以来的年数。 使用getFullYear()来获得实际的年份。

这个问题太古老了,让我为networking时代的怀旧而哭泣!

没错,Date.getYear()返回自1900年以来的年数,就像Perl的localtime()一样。 人们想知道为什么在20世纪90年代devise的语言不能解释世纪stream失,但我能说什么呢? 你必须在那里。 这种感觉在当时是有道理的(像pets.com那样)。

在2000年之前,可能会试图通过在getYear()的结果后面加上“19”来解决这个bug,从而导致“19100年的bug” 。 其他人已经充分回答了这个问题(将getDate()的结果添加到1900)。

也许你正在阅读JavaScript的书有点老了?

感谢从过去的爆炸!

我正在使用date.getUTCFullYear() ; 工作没有问题。

你得到的数字是自1900年以来的年数。不要问我为什么。

现在正在返回四位数–1900年,这可能在9年前就已经很酷了,但现在已经非常缓慢了。 Java的java.util.Date也是这样做的。

正如其他人所说的,它会返回自1900年以来的年数。之所以这样做是因为当JavaScript在90年代中期发明时,这种行为既方便又和其他语言中的date时间API一致。 特别是C.当然,一旦APIbuild立起来,由于向后兼容的原因,它们不能改变它。

顺便说一句,不同的浏览器可能会返回不同的结果,所以最好完全跳过这个函数,并总是使用getFullYear()。

var date_object = new Date(); var year = date_object.getYear(); 如果(年<2000){年=年+ 1900; } / /你会得到整整一年….