为什么 Javascript getYear() 返回 108?

IT技术 javascript date
2021-02-03 02:23:57

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

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

年 = 108?

6个回答

这是一个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 保持标准行为。

由于 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; };
2021-04-02 02:23:57

检查文档。这不是千年虫问题——而是缺少千年虫问题!这个决定最初是用 C 做出的,然后被复制到 Perl,显然是 JavaScript,可能还有其他几种语言。很久以前,使用两位数的年份显然仍然是可取的,但值得注意的是,设计该界面的人有足够的远见,意识到他们需要考虑 2000 年及以后会发生什么,所以而不是只提供最后两个年份数字,他们提供了自 1900 年以来的年数。如果您赶时间或想冒险,您可以使用两位数字。或者,如果您希望您的程序继续运行,您可以将 100 添加到结果中并使用成熟的四位数年份。

我记得我第一次在 Perl 中进行日期操作。奇怪的是,我阅读了文档显然,这不是一件常见的事情。一两年后,我在 1999 年 12 月 31 日被叫到办公室去修复在最后一刻发现的一些合同 Perl 代码中的错误,我从来没有做过任何事情。正是这个问题:标准日期调用返回自 1900 年以来的年份,程序员将其视为两位数的年份。(他们假设他们会在 2000 年获得“00”。)作为一个没有经验的年轻程序员,我们为一份“专业”工作支付了如此多的额外费用,而那些人甚至懒得阅读文档。这是多年幻灭的开始;现在我又老又愤世嫉俗了。:)

在 2000 年,一年一度的 YAPC Perl 会议被称为“YAPC 19100”,以纪念这个经常被报告的非错误。

如今,至少在 Perl 世界中,使用标准module进行日期处理更有意义,该module使用真正的四位数年份。不确定哪些内容可用于 JavaScript。

呵呵……让我想起了呆伯特的卡通片……“你读过一个名叫手册的西班牙人的故事吗?” ;)
2021-03-14 02:23:57
我相信@skiphoppy 意味着将 1900 添加到 getYear() 将产生所需的全年。这类似于在检索月份的人类可读数字时向 getMonth() 添加 +1。示例:var ts = new Date(); var fullYear = (ts.getYear()+1900); 但首选使用 getFullYear()。示例: var fullYear = new Date().getFullYear();
2021-04-03 02:23:57

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

使用date.getFullYear().

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

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