为啥 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() 相同
为啥 Boost.Asio SSL 请求返回 405 Not Allowed?