【问题标题】: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;

标签: javascript date


【解决方案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 也是这样做的。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2011-06-27
                        • 1970-01-01
                        • 2013-04-24
                        • 1970-01-01
                        • 1970-01-01
                        • 2020-03-25
                        • 1970-01-01
                        相关资源
                        最近更新 更多