为什么这个javascript会返回108而不是2008?它得到了正确的日期和月份而不是年份?
myDate = new Date();
year = myDate.getYear();
年= 108?
答案 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)
答案 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也是这样做的。