Javascript getyear() が 108 を返すのはなぜですか?
-
01-07-2019 - |
質問
この JavaScript が 2008 ではなく 108 を返すのはなぜですか?日と月は正しく取得されますが、年は正しく取得されませんか?
myDate = new Date();
year = myDate.getYear();
年 = 108?
解決
それは Y2K つまり、1900 年以降の年のみがカウントされます。
現在、互換性の問題が発生する可能性があります。 getYear()
が廃止され、 getFullYear()
- から 癖モード:
問題をさらに複雑にしているのは、date.get Year() が現在非推奨になっているため、date.getFull Year() を使用する必要があることです。このため、古いブラウザーではサポートされていません。ただし、それが機能する場合は、常に完全な年が表示されるはずです。100ではなく2000です。
ブラウザでは、次の 2 つの方法で次の年が表示されます。
* The year according to getYear(): 108
* The year according to getFullYear(): 2008
Internet Explorer と Firefox の間には実装の違いもあります。IE の実装は次のとおりです。 getYear()
次のように動作するように変更されました getFullYear()
- から IBM:
ECMAScript 仕様に従って、get Year は年から 1900 を引いた値を返しますが、本来は 1998 年を表す「98」を返すことになっていました。getyear は ECMAScript バージョン 3 で非推奨となり、getFull Year() に置き換えられました。
Internet Explorer は、getFullyear() と同様に動作するように getyear() を変更し、2000 年準拠にするようにしましたが、Mozilla は標準の動作を維持しました。
他のヒント
getFull Year は古いブラウザでは機能しないため、次のようなものを使用できます。
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
ドキュメントを確認してください。これは 2000 年問題ではありません。2000 年問題が存在しないのです。この決定はもともと C で行われ、Perl、明らかに JavaScript、そしておそらく他のいくつかの言語にコピーされました。その昔、まだ 2 桁の年を使用することが望ましいと考えられていたようですが、驚くべきことに、そのインターフェースを設計した人は、2000 年以降に何が起こるかを考える必要があることに十分な先見性を持っていたため、最後の 2 桁を提供する代わりに、 1900 年からの年数が表示されます。急いでいる場合や危険を冒したい場合は、2 桁を使用できます。あるいは、プログラムが引き続き動作するようにしたい場合は、結果に 100 を加えて、本格的な 4 桁の年を使用することもできます。
初めて Perl で日付操作を行ったときのことを覚えています。不思議なことに私は ドキュメントを読む. 。どうやらこれは一般的なことではありません。1、2 年後の 1999 年 12 月 31 日、私は契約用の Perl コードで土壇場で発見されたバグを修正するためにオフィスに呼ばれました。これまで私はまったく関与していませんでした。それはまさに次の問題でした。標準の日付呼び出しでは 1900 年以降の年が返され、プログラマはそれを 2 桁の年として扱いました。(彼らは 2000 年に「00」を取得すると想定していました。) 経験の浅い若いプログラマーとして、私たちが「プロフェッショナル」の仕事に多額の追加料金を払っているのに、その人たちは本を読もうとも思わなかったことに衝撃を受けました。ドキュメンテーション。それは長年にわたる幻滅の始まりでした。今では私は年をとって皮肉屋になった。:)
2000 年、年次 YAPC Perl カンファレンスは、この頻繁に報告された非バグにちなんで「YAPC 19100」と呼ばれるようになりました。
現在、少なくとも Perl の世界では、日付処理に実際の 4 桁の年を使用する標準モジュールを使用する方が合理的です。JavaScript で何が利用できるかはわかりません。
1900 年からの年数を返す必要があります。
使用 date.getFullYear()
.
これは(他の場所で正しく指摘されているように)2000 年問題です。Netscape (2000 年より前に作成された) は最初に復帰しました。たとえば、 98
から getYear()
. 。元に戻るのではなく、 00
, 、代わりに返されました 100
2000年に向けて。その後、他のブラウザが登場し、別の方法で実行されましたが、非互換性が蔓延したため、誰もが不満を抱きました。
それ以降のブラウザがサポートされる getFullYear
完全な年を返す標準的な方法として。
この質問はとても古いので、ドットコム時代を懐かしんで泣きそうになります。
そうです、Date.getyear() は、Perl の localtime() と同じように、1900 年からの年数を返します。1990 年代に設計された言語がなぜ世紀の移り変わりを考慮しないのか疑問に思う人もいるでしょうが、何と言えるでしょうか?あなたはそこにいなければなりませんでした。当時はそれがある意味理にかなっていました(pets.com がやったように)。
2000 年以前は、getyear() の結果に「19」を追加してこのバグを修正しようとしたかもしれません。 「19100年のバグ」. 。他の人はすでにこの質問に十分に答えています(getDate()の結果に1900を追加します)。
あなたが読んでいる JavaScript に関する本は少し古いのではないでしょうか?
過去の爆発をありがとう!
指摘されているように、決して使用しないでください getYear()
, ですが、代わりに使用します getFullYear()
.
ただし、話は「IE が実装する」ほど単純ではありません。 GetYear()
として getFullYear()
. 。最近の Opera と 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());
それはばかげています。それ Y2K 日前までの日付, 、そして現在は、従来の理由から 1900 年からの年数を返すだけです。実際の年を取得するには getFull Year() を使用します。
使っています date.getUTCFullYear()
;問題なく動作しています。
得られる数字は 1900 年からの年数です。理由は聞かないでください。
他の人が言ったように、1900 年からの年数が返されます。そうなる理由 それ JavaScript が 90 年代半ばに発明されたとき、その動作は便利であり、他の言語の日時 API と一貫性があったということです。特にC.そしてもちろん、API が確立されると、下位互換性の理由からそれを変更することはできませんでした。
ところで、異なるブラウザでは異なる結果が返される可能性があるため、この関数を完全にスキップし、常に getFull Year() を使用することをお勧めします。
var date_object=新しい日付();var year = date_object.getyear();if(year <2000){year = year + 1900;} // uは通年を取得します。
4 桁の西暦 (1900 年) が返されます。これは 9 年以上前には素晴らしかったかもしれませんが、現在ではかなり遅れています。Java の java.util.Date もこれを行います。