97

この JavaScript が 2008 ではなく 108 を返すのはなぜですか? 日と月は正しくなりますが、年はわかりませんか?

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

年 = 108?

4

14 に答える 14

130

これはY2Kのことで、1900 年からの年数だけがカウントされます。

互換性の問題の可能性があり、互換性の問題getYear()が推奨されなくなりましたgetFullYear()- quirksmodeから:

さらに複雑なことに、date.getYear() は最近では非推奨になっているため、古いブラウザーではサポートされていない date.getFullYear() を使用する必要があります。ただし、機能する場合は、常に完全な年が返されるはずです。100 ではなく 2000。

お使いのブラウザは、次の 2 つの方法で次の年を表示します。

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

Internet Explorer と Firefox の間にも実装の違いがあります。IE の実装はIBMgetYear()ように動作するように変更されたためです。getFullYear()

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

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

于 2008-09-18T23:58:40.890 に答える
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
于 2008-09-19T00:12:49.107 に答える
13

ドキュメントを確認してください。これは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会議は、この頻繁に報告されるバグではないことに敬意を表して「YAPC19100」と呼ばれました。

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

于 2008-09-19T00:42:44.700 に答える
6

1900 年からの年数を返す必要があります。

于 2008-09-18T23:55:00.023 に答える
4

使用してdate.getFullYear()ください。

これは (他の場所で正しく指摘されているように) 2000 年問題です。98Netscape (2000 年より前に作成された) は、たとえばgetYear(). に戻るの00ではなく、代わりに1002000 年に戻りました。その後、他のブラウザが現れて別の方法で実行し、非互換性が蔓延したため、誰もが不満を抱いていました。

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

于 2008-09-18T23:55:21.600 に答える
3

この質問はとても古いので、ドットコム時代の懐かしさで涙が出ます!

そうです、Date.getYear() は、Perl の localtime() と同じように、1900 年からの年数を返します。1990 年代に設計された言語が 20 世紀の売り上げを説明できないのはなぜかと思う人もいるかもしれませんが、私は何と言えますか? あなたはそこにいなければなりませんでした。それは当時(pets.comがそうであったように)ある種の意味をなしていました。

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

あなたが読んでいる JavaScript に関する本は少し古いかもしれません。

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

于 2008-09-19T00:22:16.027 に答える
2

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

ただし、ストーリーは「IE は として実装さGetYear()れていgetFullYear()ます。最近の Opera と IEは、2000 年より前の日付を最初に指定されたものとして扱いますが、2000 年以降の日付と同様に扱いますがgetYear()、webkit と Firefox は古い動作に固執します。getYear()getFullYear()

これは、すべてのブラウザーで 99 を出力します。

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

これは、FF/WebKit では 108、Opera/IE では 2008 を出力します。

javascript:alert(new Date().getYear());
于 2008-09-19T09:46:31.083 に答える
1

ばかだ。これは Y2K より前の日付にさかのぼり、従来の理由から 1900 年からの年数を返すだけになりました。実際の年を取得するには getFullYear() を使用します。

于 2008-09-18T23:58:13.683 に答える
1

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

于 2010-08-10T09:26:02.403 に答える
0

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

于 2008-09-19T00:03:46.757 に答える
0

得られる数字は、1900 年からの年数です。理由は聞かないでください。

于 2008-09-18T23:55:06.683 に答える
0

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

于 2008-11-25T07:03:58.840 に答える
0

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

于 2008-09-18T23:58:30.797 に答える
-1

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

于 2008-09-18T23:55:46.043 に答える