2

(編集:以下のコードにクロムコンソールを使用しています)

javascript Date() が非推奨になっていることは認識していますが、現在取り組んでいるものには便利です。ただし、奇妙な問題があります。

var x = new Date('999').getFullYear()

999 を返します

その間

var x = new Date('1000').getFullYear()

同様に 999 を返しますが、

var x = new Date('10000').getFullYear()

10000 を返します...

4桁の数字が間違った.getFullYear()を与える理由を誰かが知っていますか?

4

5 に答える 5

2

Date.parse他の回答が示唆するように、特に西暦 1000 年より前の日付を扱っている場合は、ブラウザ間で信頼することはできません。

Chromeに関する限り、問題はブラウザがタイムゾーンを処理する方法にあるようです. 次の例は、1000 CE より前に、Chrome がその上にローカル タイムゾーンの日付を解析することを示しています。>= 1000 CE、最初に UTC で日付を解析し、次にタイムゾーン変換を適用するように見えます:

> new Date('1000')
"Tue Dec 31 999 16:00:00 GMT-0800 (PST)"
> new Date('999')
"Tue Jan 01 999 00:00:00 GMT-0800 (PST)"

私はこれをバグと見なす傾向がありますが、おそらくChromiumチームはそれが機能だと考えています:)。

肝心なのは、何年もの間、特に古代の正確な日付の解析が必要な場合は、自分で何らかの作業を行うか、ライブラリを使用する必要があるということです。Moment.jsDatejsはどちらも役立つかもしれませんが、どちらも古代をうまく扱えるとは思えません。Moment.js にも同じ問題があるようです (Chrome の場合):

> moment('999').year()
999
> moment('1000').year()
999

古代に基づいて日付を正確に設定するために私が知っている最善の方法は、一般に、a) 常に UTC を使用し、b) 日付を手動で設定することです。

var d = new Date();
d.setUTCFullYear('999');
d.getUTCFullYear(); // 999
d.setUTCFullYear('1000');
d.getUTCFullYear(); // 1000

少なくとも Chrome では、これは文字列と整数の両方で機能します。

AD、CE、BC、および BCE 拡張子を持つ古い年と負の数を処理gregorianする Timemap.js ライブラリのパーサーにも興味があるかもしれません。

于 2012-09-14T21:32:53.447 に答える
2

このページを見てください。このparse メソッドに渡される文字列を渡しています。3 つの整数を渡さない限り、最初の引数は「年」ではありません。最後に、クラス自体は非推奨ではありませんが、そのメンバーの一部は非推奨です (使用getYear()しているものに置き換えられているgetFullYear()ものを含む)。

于 2012-09-14T21:30:10.693 に答える
1

このフィドル は、Firefox ではそうではありません。もしかしてブラウザ関係?

于 2012-09-14T21:26:31.103 に答える
0

alert(new Date('999').getFullYear());NaNFirefox 15.0.1 での利回り

うーん..Chrome 21.0.1180.57は「999」を生成します

于 2012-09-14T21:28:13.677 に答える
0
var x = new Date('10000').getFullYear()

に変更します

var x = new Date(10000).getFullYear()

invalid datestring日付コンストラクターに送信しています。

于 2012-09-14T21:34:47.930 に答える