为什么 Javascript getYear() 返回 108?
-
01-07-2019 - |
题
为什么这个 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 年之前编写)最初返回,例如 98
从 getYear()
. 。而不是回到 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 也做到了这一点。