Javascript getYear()が108を返すのはなぜですか?


95

このjavascriptが2008ではなく108を返すのはなぜですか?それは日と月を正しく取得しますが、年は取得しませんか?

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

年= 108?


29
ああ、私たちがY2Kを乗り越えようとした罪です。
DGentry 2008

3
year = myDate.getFullYear() % 100;
Andrew Larsson

回答:


128

これは2000年問題であり、1900年からの年数のみがカウントされます。

互換モードの潜在的な問題があり、getYear()非推奨になりました-quirksmodegetFullYear()から:

問題をさらに複雑にするために、date.getYear()は現在非推奨になっているため、古いブラウザーではサポートされていないdate.getFullYear()を使用する必要があります。しかし、それが機能する場合は、常に1年間、つまり 100ではなく2000。

あなたのブラウザはこれらの2つの方法で次の年を与えます:

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

IEの実装は次のようにInternet ExplorerとFirefoxの間の実装の違いもありますgetYear()ように振る舞うように変更されましたgetFullYear()-からIBM

ECMAScript仕様によれば、getYearは年から1900を引いた値を返します。本来は1998年の「98」を返すことを意味していました。getYearはECMAScriptバージョン3で廃止され、getFullYear()に置き換えられました。

Internet Explorerは、getYear()をgetFullYear()のように動作するように変更し、Y2k準拠にしましたが、Mozillaは標準の動作を維持しました。


25

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

7
Date.prototype.getRealYear = Date.prototype.getFullYear?Date.prototype.getFullYear:function(){return this.getYear()+ 1900; };
Valentin Golev、2009年

12

ドキュメントを確認してください。これは2000年問題ではありません-2000年問題の欠如です!この決定はもともとCで行われ、Perlにコピーされたようです。おそらくJavaScript、そしておそらく他のいくつかの言語にコピーされました。そのずっと前はまだ2桁の年を使用するのが望ましいと思われていましたが、そのインターフェイスを設計した人は誰でも、2000年以降に何が起こるかを考える必要があることを理解するのに十分な先見性があったので、最後の2年を提供するだけでなく数字は、1900年からの年数を提供します。急いでいる場合や危険を伴う場合は、2桁を使用できます。または、プログラムを引き続き機能させたい場合は、結果に100を加えて、本格的な4桁の年を使用できます。

Perlで初めて日付操作をしたときのことを覚えています。不思議なことに私はドキュメント読みました。明らかにこれは一般的なことではありません。1、2年後、1999年12月31日にオフィスに電話をかけて、契約のPerlコードで可能な限り最後に発見されたバグを修正しました。それはまさにこの問題でした。標準の日付呼び出しは1900年から年を返し、プログラマーはそれを2桁の年として扱いました。(彼らは2000年に "00"を受け取ると想定していました。)若い経験の浅いプログラマーとして、私たちが "専門職"の仕事に多額のお金を払っていたこと、そしてそれらの人々は読むことさえも気にしていなかったことに私の心を吹き飛ばしました。ドキュメンテーション。それは長年の幻滅の始まりでした。今、私は年をとっていて、皮肉です。:)

2000年には、この頻繁に報告された非バグを称えて、年に1度のYAPC Perl会議が「YAPC 19100」と呼ばれました。

今日では、少なくともPerlの世界では、日付処理に標準モジュールを使用する方が理にかなっています。これは、実際の4桁の年を使用するものです。JavaScriptで何が利用できるかわからない。


1
へへ...ディルバートの漫画を思い出します...「Manualという名前のスペイン人の男の話を読みましたか?」;)
Adhip Gupta

@skiphoppyは、getYear()に1900を追加すると、希望する1年が生成されることを意味すると思います。これは、人間が読める数の月を取得するときにgetMonth()に+1を追加するのと同じです。例:var ts = new Date(); var fullYear =(ts.getYear()+ 1900); ただし、getFullYear()を使用することをお勧めします。例:var fullYear = new Date()。getFullYear();
再帰


4

使用しますdate.getFullYear()

これは(他の場所で正しく指摘されているように)2000年問題です。Netscape(2000年以前に作成)は、たとえば98から最初に返されましたgetYear()。むしろへの復帰より00代わりに返さ、それは1002000年のために続いて他のブラウザでは、一緒に来て、別々にそれをやった、と互換性が在位として誰もが不幸でした。

それ以降のブラウザーはgetFullYear、1年全体を返すための標準的な方法としてサポートされていました。


3

この質問は古すぎるので、ドットコム時代には懐かしさで泣きます!

そうです、Date.getYear()は、Perlのlocaltime()と同じように、1900年からの年数を返します。1990年代に設計された言語では世紀の売上高が説明されないのはなぜでしょうか。あなたはそこにいなければなりませんでした。それは、(pets.comがしたように)当時は一種の理にかなっています。

2000年より前は、getYear()の結果に「19」を追加して「19100年のバグ」という結果になり、このバグを修正したくなるかもしれません。他の人はすでにこの質問に十分回答しています(getDate()の結果に1900を追加)。

JavaScriptについて読んでいる本は少し古いかもしれません。

過去からの爆風をありがとう!


言語(Perl)がそれを考慮に入れなかった理由は、はるか以前に行われたCの設計決定を盲目的にコピーしていたためです。(20年?)
skiphoppy 2008

PerlではなくJavaScriptに影を投げていました。Perlは、多くの場合、基礎となるCルーチンを直接公開します。あなたが言うように、それはその時代の産物です。少なくとも10年後に設計されたJSは、別の道を進んでいた可能性があります。
jjohn

2

指摘したようgetYear()に、を使用しないでくださいgetFullYear()。代わりにを使用してください。

物語は、IEの実装」のような単純なようではありませんしかしGetYear()としてgetFullYear()扱い、これらの日。オペラや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());


1

私は使用していdate.getUTCFullYear()ます。問題なく働いています。



0

他の人が言ったように、それは1900年それがない理由以来、年の数を返すことが JavaScriptは90年代半ばに発明されたとき、その行動が便利で他の言語の日付時刻のAPIと一致両方だったということです。特にC.そしてもちろん、APIが確立されると、後方互換性の理由でAPIを変更することはできませんでした。


0

ところで、ブラウザによって結果が異なる可能性があるため、この関数をすべてスキップして、常にgetFullYear()を使用することをお勧めします。


0

var date_object = new Date(); var year = date_object.getYear(); if(年<2000){年=年+ 1900; } // uは1年間取得します....


-1

それは4桁の年-1900を返します。これは9年以上前にはクールでしたが、現在はかなり遅れています。Javaのjava.util.Dateもこれを行います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.