3

フィールド値をタイムスタンプに変換するために JavaScript の Date オブジェクトを使用しています。同じコードが数年前から機能していますが、今日はタイトルに日付が含まれているという奇妙な動作がありました。

次のコードで要約できます。

// 06 June 2013
DateTemp = new Date();
DateTemp.setFullYear( 2013 );
DateTemp.setMonth( 5 );
DateTemp.setDate( 6 );
DateTemp.setHours( 0 );
DateTemp.setMinutes( 0 );
DateTemp.setSeconds( 0 );
console.log( DateTemp.getMonth() ); // 5

DateTemp.setMonth( 6 );
console.log( DateTemp.getMonth() ); // 6

DateTemp.setMonth( 7 );
console.log( DateTemp.getMonth() ); // 7

私はそれが戻ることを期待しています: 5 6 7

しかし、それは出力します: 6 6 7

したがって、ユーザーがこの日付をフィールドに入力すると、1 か月後の日付が保存されます... 誰かが私が完全に台無しにした場所を説明していただければ、事前に感謝します。

良い1日を、

4

1 に答える 1

8

日を設定する行と月を設定する行を入れ替えます。

DateTemp = new Date();
DateTemp.setFullYear( 2013 );
DateTemp.setDate( 6 );
DateTemp.setMonth( 5 );
DateTemp.setHours( 0 );
DateTemp.setMinutes( 0 );
DateTemp.setSeconds( 0 );
console.log( DateTemp.getMonth() ); // 5

DateTemp.setMonth( 6 );
console.log( DateTemp.getMonth() ); // 6

DateTemp.setMonth( 7 );
console.log( DateTemp.getMonth() ); // 7

何が起こっている?

コンストラクターを使用すると、現在のnew Date()日付を持つ新しい Date オブジェクトが作成されます。したがって、今日は次のようになります。

Date {Fri May 31 2013 14:20:32 GMT+0200}

コードで、最初に月を 6 月に変更します。しかし、6 月 31 日は JavaScript によって処理され、これは次のように変換されます。

Date {Mon Jul 01 2013 14:21:28 GMT+0200}

その後、その日の設定と他のすべての部分が正常に機能します。しかし、最終的には 1 か月先を進んでいるように見えます。

したがって、最終的な解決策は、この「オーバーフロー」が発生しないように値を設定する順序を変更するか、それぞれの引数でコンストラクターを直接使用することです。

new Date( 2013, 5, 6 );
于 2013-05-31T12:19:04.697 に答える