为什么Javascript getYear()返回108?

时间:2020-03-06 14:24:04  来源:igfitidea点击:

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

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

年= 108?

解决方案

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

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

使用date.getFullYear()

(正如在其他地方正确指出的那样)这是一个千年虫问题。 Netscape(在2000年之前编写)最初返回,例如从getYear()返回98. 它没有返回" 00",而是返回了2000年的" 100"。随后出现了其他浏览器,并以不同的方式进行了处理,当不兼容盛行时,每个人都不满意。

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

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

太傻了它的日期可追溯到2000年以前的日期,由于种种原因,现在仅返回自1900年以来的年数。使用getFullYear()获取实际年份。

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

这是一个Y2K问题,仅计算自1900年以来的年份。

现在,由于quirksmode弃用了getYear(),而赞成使用getFullYear(),存在潜在的兼容性问题:

To make the matter even more complex, date.getYear() is deprecated nowadays and you should use date.getFullYear(), which, in turn, is not supported by the older browsers. If it works, however, it should always give the full year, ie. 2000 instead of 100.
  
  Your browser gives the following years with these two methods:
* The year according to getYear(): 108
* The year according to getFullYear(): 2008

Internet Explorer和Firefox之间也存在实现差异,因为IE的getYear()实现已更改为类似于IBM的getFullYear()行为:

Per the ECMAScript specification, getYear returns the year minus 1900, originally meant to return "98" for 1998. getYear was deprecated in ECMAScript Version 3 and replaced with getFullYear(). 
  
  Internet Explorer changed getYear() to work like getFullYear() and make it Y2k-compliant, while Mozilla kept the standard behavior.

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

由于getFullYear在较旧的浏览器中不起作用,因此可以使用以下方法:

Date.prototype.getRealYear = function() 
{ 
    if(this.getFullYear)
        return this.getFullYear();
    else
        return this.getYear() + 1900; 
};

Java原型可用于扩展现有对象,就像Cextension方法一样。现在,我们可以做到这一点;

var myDate = new Date();
myDate.getRealYear();
// Outputs 2008

这个问题太老了,让我在互联网泡沫中流连忘返!

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

在2000年之前,可能会尝试通过在getYear()的结果后添加" 19"(导致" 19100年错误")来解决此错误。其他人已经足够回答了这个问题(将getDate()的结果添加1900)。

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

感谢过去的爆炸!

检查文档。这不是千年虫问题-缺少千年虫问题!这个决定最初是用C语言做出的,然后被复制到Perl,显然是JavaScript以及其他几种语言中。很久以前,显然仍然希望使用两位数的年份,但是值得注意的是,设计该界面的人都具有足够的前瞻性,意识到他们需要考虑2000年及以后的情况,因此,不仅仅提供最后两个年份数字,它们提供了自1900年以来的年数。如果我们急于要冒险,可以使用两位数字。或者,如果我们希望程序继续运行,则可以将结果加100,并使用完整的四位数年份。

我记得我第一次在Perl中进行日期操作。奇怪的是,我阅读了文档。显然,这并不常见。一两年后的1999年12月31日,我被召集到办公室来修复在某个合同Perl代码中可能在最后一分钟发现的bug,这些东西我从来都没有关系。正是这个问题:标准日期调用返回了自1900年以来的年份,而程序员将其视为两位数的年份。 (他们以为他们在2000年会获得" 00"。)作为一个年轻的,没有经验的程序员,我大吃一惊,因为我们为"专业"工作付出了这么多的钱,而那些人甚至都不花心思去阅读。文档。这是幻灭多年的开始;现在我老了,愤世嫉俗。 :)

在2000年,为纪念这种经常报告的非错误,每年的YAPC Perl会议被称为" YAPC 19100"。

如今,至少在Perl世界中,使用标准模块进行日期处理更有意义,该模块使用实际的四位数年份。不知道什么可能适用于JavaScript。

正如我们指出的那样,切勿使用getYear(),而应使用getFullYear()

但是,这个故事并不像" IE将getYear()实现为getFullYear()那样简单。如今,Opera和IE都将getYear()看作是最初为2000年之前的日期指定的getYear(),对于2000年之后的日期,将其视为" getFullYear()",而webkit和Firefox则坚持旧的行为

在所有浏览器中输出99:

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

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

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

var date_object = new Date();
var year = date_object.getYear();
if(年<2000){
年=年+ 1900;
}
// u将获得整年的信息...。

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