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

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

年 = 108?

有帮助吗?

解决方案

它是 千年虫 事情,只计算1900年以来的年份。

现在存在潜在的兼容性问题 getYear() 已被弃用,取而代之的是 getFullYear() - 从 怪癖模式:

让事情变得更加复杂的是,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() - 从 国际商业机器公司:

根据 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 以及可能其他几种语言中。很久以前,显然仍然需要使用两位数的年份,但值得注意的是,无论设计该界面的人都有足够的深谋远虑,他们都意识到他们需要考虑 2000 年及以后会发生什么,所以而不是仅仅提供最后两位数字,它们提供了自 1900 年以来的年数。如果您赶时间或想冒险,您可以使用这两位数字。或者,如果您希望程序继续运行,您可以将结果加 100 并使用完整的四位数年份。

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

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

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

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

使用 date.getFullYear().

这是(正如其他地方正确指出的那样)是千年虫问题。Netscape(2000 年之前编写)最初返回,例如 98getYear(). 。而不是回到 00, ,它反而返回 100 2000 年。然后其他浏览器出现并以不同的方式执行,每个人都因为不兼容而感到不满。

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

这个问题太老了,让我怀念互联网时代而哭泣!

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

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

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

感谢过去的爆炸!

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

然而,故事并不像“IE 实现 GetYear() 作为 getFullYear(). 。Opera 和 IE 这些天对待 getYear() 作为 getYear() 最初指定为 2000 年之前的日期,但将其视为 getFullYear() 对于 2000 年之后的日期,而 webkit 和 Firefox 则坚持旧的行为

在所有浏览器中输出 99:

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

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

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

这是愚蠢的。它 日期为千禧年之前, ,现在由于遗留原因仅返回自 1900 年以来的年数。使用 getFullYear() 获取实际年份。

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

您得到的数字是自 1900 年以来的年数。别问我为什么..

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

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

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

它返回 4 位数年份 - 1900,这在 9 多年前可能很酷,但现在相当落后。Java 的 java.util.Date 也做到了这一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top