为啥 Javascript getYear() 返回 108?

Posted

技术标签:

【中文标题】为啥 Javascript getYear() 返回 108?【英文标题】:Why does Javascript getYear() return 108?为什么 Javascript getYear() 返回 108? 【发布时间】:2010-09-11 00:27:20 【问题描述】:

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

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

年 = 108?

【问题讨论】:

哦,我们在试图通过 Y2K 时犯下的罪过。 year = myDate.getFullYear() % 100; 【参考方案1】:

这是Y2K 的事情,只计算自 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 保持标准行为。

【讨论】:

【参考方案2】:

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

【讨论】:

也许像 Date.prototype.getRealYear = Date.prototype.getFullYear 一样? Date.prototype.getFullYear : function() return this.getYear() + 1900; ;【参考方案3】:

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

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

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

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

【讨论】:

呵呵...让我想起了呆伯特卡通...“你读过关于一个名叫Manual的西班牙人的故事吗?” ;) 我相信@skiphoppy 意味着将 1900 添加到 getYear() 会产生所需的全年。这类似于在检索人类可读的月份数时向 getMonth() 添加 +1。示例: var ts = new Date(); var fullYear = (ts.getYear()+1900);但首选使用 getFullYear()。示例:var fullYear = new Date().getFullYear();【参考方案4】:

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

【讨论】:

【参考方案5】:

使用date.getFullYear()

这是(正如其他地方正确指出的那样)是千年虫的事情。 Netscape(写于 2000 年之前)最初返回,例如 98 来自 getYear()。它没有返回 00,而是返回了 2000 年的 100。然后其他浏览器出现并以不同的方式出现,每个人都不满意,因为不兼容盛行。

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

【讨论】:

【参考方案6】:

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

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

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

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

感谢过去的爆炸!

【讨论】:

语言 (Perl) 没有考虑到这一点的原因是它盲目地复制了很久以前就做出的 C 设计决策。 (20 年?) 我在使用 JavaScript,而不是 Perl。 Perl 经常相当直接地公开底层的 C 例程。正如你所说,它是时代的产物。至少在十年后设计的 JS 可能会走不同的路线。【参考方案7】:

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

然而,故事并不像“IE 将GetYear() 实现为getFullYear() 那样简单。如今Opera 和IE 将getYear() 视为getYear() 最初指定用于2000 年之前的日期,但会将其视为@987654327 @ 表示 2000 年之后的日期,而 webkit 和 Firefox 坚持旧行为

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

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

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

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

var date_object=new Date(); var year = date_object.getYear(); 如果(年

【讨论】:

【参考方案14】:

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

【讨论】:

以上是关于为啥 Javascript getYear() 返回 108?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript Date.getFullYear() 行为与 Date.getYear() 相同

请问javascript的日期问题?

为啥 Boost.Asio SSL 请求返​​回 405 Not Allowed?

为啥 isset($this->var) 在我的 Codeigniter 模型中总是返​​回 false?

聊聊一直困扰前端程序员的浏览器兼容-JavaScript

js如何换行