为什么Javascript getYear()返回108?

时间:2008-09-18 23:53:48

标签: javascript date

为什么这个javascript会返回108而不是2008?它得到了正确的日期和月份而不是年份?

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

年= 108?

14 个答案:

答案 0 :(得分:125)

这是一个Y2K的事情,只计算自1900年以来的几年。

现在存在潜在的兼容性问题,getYear()已被弃用,而不是getFullYear() - 来自quirksmode

  

为了使问题更加复杂,现在不推荐使用date.getYear(),你应该使用date.getFullYear(),而旧版浏览器不支持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”。在ECMAScript版本3中不推荐使用getYear并将其替换为getFullYear()。

     

Internet Explorer将getYear()更改为getFullYear(),并使其符合Y2k标准,而Mozilla保持标准行为。

答案 1 :(得分:24)

由于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

答案 2 :(得分:10)

检查文档。这不是Y2K问题 - 缺少Y2K问题!这个决定最初是在C中完成的,并被复制到Perl中,显然是JavaScript,可能还有其他几种语言。很久以前,显然仍然觉得使用两位数的年份仍然是可取的,但是设计这个界面的任何人都有足够的预见意识到他们需要考虑2000年及以后会发生什么,所以不要只提供最后两个数字,他们提供了自1900年以来的年数。如果你匆忙或想要冒险,你可以使用两位数。或者,如果您希望程序继续工作,您可以在结果中添加100并使用完整的四位数年份。

我记得第一次在Perl中进行日期操作。奇怪的是,我阅读了文档。显然这不是常见的事情。一年或两年后,我于1999年12月31日被召入办公室,修复了在一些合同Perl代码中最后可能发现的错误,这些错误我从未与之有任何关系。这是一个确切的问题:自1900年以来标准日期调用返回了几年,程序员将其视为两位数的年份。 (他们假设他们在2000年会得到“00”。)作为一个年轻的没有经验的程序员,我心里想到我们为“专业”工作付了那么多额外费用,那些人甚至都不愿意阅读文档。这是多年幻灭的开始;现在我老了,愤世嫉俗。 :)

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

如今,至少在Perl世界中,使用标准模块进行日期处理更有意义,使用真正的四位数年份。不确定JavaScript可用的内容。

答案 3 :(得分:6)

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

答案 4 :(得分:4)

使用date.getFullYear()

这是(如在其他地方正确指出的)是Y2K的事情。 Netscape(2000年之前编写)最初返回,例如来自98的{​​{1}}。而不是返回getYear(),而是在2000年返回00。然后其他浏览器出现并以不同的方式执行,并且每个人都不满意,因为不兼容的统治。

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

答案 5 :(得分:2)

这个问题太老了,让我为网络日的怀旧而哭泣!

没错,Date.getYear()返回自1900年以来的年数,就像Perl的localtime()一样。人们想知道为什么在20世纪90年代设计的语言不能解释世纪的营业额,但我能说什么呢?你必须在那里。它有点像当时的意义(就像pets.com那样)。

在2000年之前,人们可能想通过在getYear()的结果中附加“19”来导致"year 19100 bug"来修复此错误。其他人已经充分回答了这个问题(将1900添加到getDate()的结果中)。

也许您正在阅读的关于JavaScript的书有点老了?

感谢过去的爆炸!

答案 6 :(得分:2)

您应该如指出的那样,永远不要使用getYear(),而是使用getFullYear()

然而,故事并不像“IE实现GetYear()getFullYear()那么简单。现在,Opera和IE将getYear()视为最初为2000年之前的日期指定的getYear() ,但在2000年之后的日期将其视为getFullYear(),而webkit和Firefox坚持旧的行为

在所有浏览器中输出99:

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

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

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

答案 7 :(得分:1)

这是愚蠢的。它dates to pre-Y2K days,现在只返回自1900年以来的遗留原因。使用getFullYear()获取实际年份。

答案 8 :(得分:1)

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

正如其他人所说的,它返回了自1900年以来的年数。它之所以 的原因是,当JavaScript在90年代中期发明时,这种行为既方便又符合其他语言的日期时间API。特别是C.当然,一旦API建立起来,由于向后兼容的原因,它们无法改变它。

答案 11 :(得分:0)

BTW,不同的浏览器可能会返回不同的结果,因此最好完全跳过此功能并始终使用getFullYear()。

答案 12 :(得分:0)

var date_object = new Date(); var year = date_object.getYear(); if(year< 2000){     年=年+ 1900年; } //你将获得全年....

答案 13 :(得分:-1)

它正在返回4位数年份 - 1900年,这可能在9年多以前很酷,但现在相当迟钝。 Java的java.util.Date也是这样做的。