2017-02-01 14 views
1
function datecheck(){ 
    var dt1 = new Date(); 
    dt1.setUTCFullYear("2017"); 
    dt1.setUTCDate("1"); 
    dt1.setUTCMonth("1"); 
    alert(dt1.getUTCMonth()); 
} 

この機能を実行すると、アラートとして0が表示されますが、setUTCMonth( "2")の場合は0になります。私は警戒して2を得ている。同様に3,4,5,6,7,8 ...が指定されている場合は、同じ月にそれが通知され、その後1月の問題は何かが通知されます。javacript january date issue

しかし、また、私は1が渡されたとき

function datecheck(){ 
    var dt1 = new Date(); 
    dt1.setUTCFullYear("2017"); 
    dt1.setUTCMonth("1"); 
    dt1.setUTCDate("1"); 
    alert(dt1.getUTCMonth()); 
} 

動作の変更ならば、それは0に警告を開始することを観察しました。私は何が起こっているのか全然混乱しています...

誰かが間違っていると私に教えてもらえますか?

ありがとうございます。

+1

JavaScriptの月間は0〜11です。いいえ、それは理にかなっていません。いいえ、下位互換性が損なわれるため変更できません。はい、それは私たちをすべて夢中にさせます。 –

+0

月(および日と年)も数字であり、文字列ではありません。なぜあなたは '' 1 ''と書いておけばいいのですか? –

+2

@JaredSmith個人的に私は好きです - '['Jan'、 'Feb'、 'Mar' ....] [date.getUTCMonth()]'は素敵なトリックです:D –

答えて

1

あなたにはいくつかの問題があります。まず、Dateのオブジェクトを変異させることはお勧めできません。実際にはあなたがしていることを知っていなければなりません。コンストラクタに必要なパラメータを渡す方が良いでしょう:

var jan1 = new Date(2017, 0, 1); 

私はゼロになりました。これは、他の日付関連のカウントとは異なり、JavaScriptの月間は0〜11になるからです。

第2に、タイムゾーンの影響を無視しています。 JavaScriptは、ローカルタイムゾーン内のDateオブジェクトを構築します。たとえば、現時点ではGMT -5です。 私は自分のブラウザのコンソールに次のような場合:

var dec31 = new Date(2016, 11, 31, 20); // 20hr == 8pm 
dec31.getMonth(); // 11 
dec31.getUTCMonth(); // 0 

はオフセット5時間は来月にUTC時刻をプッシュします。

+0

OPがすべての[[gs] etUTC * '関数を使用しているので、これがどう答えるかわかりません... –

+0

@NiettheDarkAbsolはいくつかの前提に基づいていますその結果、メソッドが呼び出された順番に依存しています。かなり複雑なタイトルと本文で質問が表示されているようなものですが、「非同期リクエストから結果を返す方法」の瞬間をほぼ即座に知っています本能だけで。 –

+0

十分なフェア! :D –