关于日期:为什么Javascript getYear()返回108?

关于日期:为什么Javascript getYear()返回108?

Why does Javascript getYear() return 108?

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

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

年= 108?


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

现在已经存在潜在的兼容性问题,因为已弃用了getFullYear(),而推荐使用getFullYear()-从quirksmode:

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:

1
2
* The year according to getYear(): 108
* The year according to getFullYear(): 2008

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

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在较旧的浏览器中不起作用,因此可以使用以下方法:

1
2
3
4
5
6
7
Date.prototype.getRealYear = function()
{
    if(this.getFullYear)
        return this.getFullYear();
    else
        return this.getYear() + 1900;
};

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

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


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

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

在2000年,为了纪念这个经常报告的非bug,每年的YAPC Perl会议都被称为" YAPC 19100"。

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


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


使用date.getFullYear()

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

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


这个问题太老了,让我在互联网泡沫时期怀旧而哭泣!

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

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

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

感谢过去的爆炸!


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

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

在所有浏览器中输出99:

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

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

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

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


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


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


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


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


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


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


推荐阅读