97

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

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

年 = 108?

4

14 回答 14

130

这是千年虫问题,只计算自 1900 年以来的年份。

现在有潜在的兼容性问题getYear()已被弃用,取而代之的是getFullYear()- from 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 保留了标准行为。

于 2008-09-18T23:58:40.890 回答
25

由于 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
于 2008-09-19T00:12:49.107 回答
13

检查文档。这不是千年虫问题——而是缺少千年虫问题!这个决定最初是用 C 语言做出的,后来被复制到 Perl、显然是 JavaScript 和可能的其他几种语言中。很久以前,使用两位数的年份显然仍然是可取的,但值得注意的是,设计该界面的人有足够的远见,意识到他们需要考虑在 2000 年及以后会发生什么,所以不要只提供最后两个数字,他们提供了自 1900 年以来的年数。如果您赶时间或想冒险,可以使用这两位数字。或者,如果您希望您的程序继续工作,您可以将结果加上 100 并使用成熟的四位数年份。

我记得我第一次在 Perl 中进行日期操作。奇怪的是,我阅读了文档。显然,这不是一件常见的事情。一两年后,我在 1999 年 12 月 31 日被叫到办公室修复一个在最后一刻发现的一些合同 Perl 代码中的错误,这是我从未有过的事情。正是这个问题:标准日期调用返回自 1900 年以来的年份,程序员将其视为两位数年份。(他们认为他们在 2000 年会得到“00”。)作为一个没有经验的年轻程序员,让我大吃一惊的是,我们为一份“专业”工作付出了如此多的额外费用,而那些人甚至懒得去阅读文档。这是多年幻灭的开始。现在我老了,愤世嫉俗。:)

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

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

于 2008-09-19T00:42:44.700 回答
6

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

于 2008-09-18T23:55:00.023 回答
4

使用date.getFullYear().

这是(正如在别处正确指出的那样)是千年虫的事情。Netscape(写于 2000 年之前)最初返回,例如98getYear(). 它没有返回00,而是返回1002000 年。然后其他浏览器出现并以不同的方式出现,并且由于不兼容而导致每个人都不高兴。

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

于 2008-09-18T23:55:21.600 回答
3

这个问题太老了,让我怀念网络时代的泪水!

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

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

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

感谢过去的爆炸!

于 2008-09-19T00:22:16.027 回答
2

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

然而,这个故事并不像“ IE实现GetYear()getFullYear().getYear()getYear()getFullYear()

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

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

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

javascript:alert(new Date().getYear());
于 2008-09-19T09:46:31.083 回答
1

这是愚蠢的。它可以追溯到 Y2K 之前的天数,现在由于遗留原因只返回自 1900 年以来的年数。使用 getFullYear() 获取实际年份。

于 2008-09-18T23:58:13.683 回答
1

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

于 2010-08-10T09:26:02.403 回答
0

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

于 2008-09-18T23:55:06.683 回答
0

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

于 2008-09-18T23:58:30.797 回答
0

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

于 2008-09-19T00:03:46.757 回答
0

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

于 2008-11-25T07:03:58.840 回答
-1

它正在返回 4 位数的年份 - 1900,这在 9 多年前可能很酷,但现在已经很迟钝了。Java 的 java.util.Date 也可以做到这一点。

于 2008-09-18T23:55:46.043 回答