2016-09-13 7 views
1

だから、私はあなたが何年も食べることができ、その年の毎月の日数を吐き出すという簡単なスクリプトを書いています。私の機能は次のようになります:JSの奇妙な日付()オブジェクト

function(year){ 
    var months = []; 
    var date = new Date(); 
    date.setFullYear(year); 


    for(i = 1; i < 13; i++){ 
     date.setMonth(i); 
     date.setDate(0); 
     months[i] = date.getDate(); 
     console.log([date, i, date.getMonth()]); 
    } 

    console.log(months); 
    return months; 
} 

私の知っている限りでは治療をしなければなりませんが、最も奇妙なことは8月頃です。ここでは、コンソールログです:

VM691:10 [Sun Jan 31 2016 12:31:41 GMT+0000 (GMT), 1, 0] 
VM691:10 [Mon Feb 29 2016 12:31:41 GMT+0000 (GMT), 2, 1] 
VM691:10 [Thu Mar 31 2016 12:31:41 GMT+0100 (BST), 3, 2] 
VM691:10 [Sat Apr 30 2016 12:31:41 GMT+0100 (BST), 4, 3] 
VM691:10 [Tue May 31 2016 12:31:41 GMT+0100 (BST), 5, 4] 
VM691:10 [Thu Jun 30 2016 12:31:41 GMT+0100 (BST), 6, 5] 
VM691:10 [Sun Jul 31 2016 12:31:41 GMT+0100 (BST), 7, 6] 
VM691:10 [Fri Sep 30 2016 12:31:41 GMT+0100 (BST), 8, 8] 
VM691:10 [Fri Sep 30 2016 12:31:41 GMT+0100 (BST), 9, 8] 
VM691:10 [Mon Oct 31 2016 12:31:41 GMT+0000 (GMT), 10, 9] 
VM691:10 [Wed Nov 30 2016 12:31:41 GMT+0000 (GMT), 11, 10] 
VM691:10 [Sat Dec 31 2016 12:31:41 GMT+0000 (GMT), 12, 11] 
VM691:13 [1: 31, 2: 29, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 30, 9: 30, 10: 31, 11: 30, 12: 31] 

あなたは9月、私ははっきりと8月(ステートカウントにもかかわらず、二回読まれる見ることができるようにsetMonth(i)が1 = 1月、すなわち、古典的な順序で数ヶ月を要しますが、getMonth()プログラムの順序0 = 1でそれらを返します。だから私は少し掘りを行なったし、(8月)setMonthメソッドが明示的に8に設定されている場合ことが判明コンソールは、8月と9月の間で変動するリストを返します。

VM757:10 [Wed Aug 31 2016 12:36:12 GMT+0100 (BST), 1, 7] 
VM757:10 [Fri Sep 30 2016 12:36:12 GMT+0100 (BST), 2, 8] 
VM757:10 [Wed Aug 31 2016 12:36:12 GMT+0100 (BST), 3, 7] 
VM757:10 [Fri Sep 30 2016 12:36:12 GMT+0100 (BST), 4, 8] 
VM757:10 [Wed Aug 31 2016 12:36:12 GMT+0100 (BST), 5, 7] 
VM757:10 [Fri Sep 30 2016 12:36:12 GMT+0100 (BST), 6, 8] 
VM757:10 [Wed Aug 31 2016 12:36:12 GMT+0100 (BST), 7, 7] 
VM757:10 [Fri Sep 30 2016 12:36:12 GMT+0100 (BST), 8, 8] 
VM757:10 [Wed Aug 31 2016 12:36:12 GMT+0100 (BST), 9, 7] 
VM757:10 [Fri Sep 30 2016 12:36:12 GMT+0100 (BST), 10, 8] 
VM757:10 [Wed Aug 31 2016 12:36:12 GMT+0100 (BST), 11, 7] 
VM757:10 [Fri Sep 30 2016 12:36:12 GMT+0100 (BST), 12, 8] 
VM757:13 [1: 31, 2: 30, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 30, 9: 31, 10: 30, 11: 31, 12: 30] 

9を設定すると、それだけで9月を返し、で7は7月だけなので、何が得られますか?

ご協力いただければ幸いです。あなたのコードによる乾杯

+0

"たとえば、dayValueに0が指定されている場合、日付は前月の最終日に設定されます。 [setDate docs](https://developer.mozilla。org/ja-ja/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate)を参照してください。なぜそれが重複を引き起こしているのか分かりません。その場合、なぜ 'setDay(0)'と 'setMonth(8)'が明示的に定義されていると、septとaugの間でちらつきが起きるのでしょうか? –

+0

確かに毎回8月の最後の日を返すべきですか? –

答えて

2

ステップと何が起こるかを参照してください。

  • を初期設定、日付= 13/9月/ 2016
  • は日付= 13/2月/ 2016、1に
  • 設定し、月のループを入力します。
  • 設定0日目に、日付= 0/2月/ 2016 = 31 /月/ 2016
  • ログの詳細
     

  • から2まで

  • セット月、日= 31 /月/ 2016
  • セット日、日付= 0 /月/ 2016 = 29/2月/ 2016
  • ログイン:0
  • ループの2回目の反復は、詳細

これは、8月までうまくいきます。

  • セット月8日付= 30/8月/ 2016
  • セット日に0、日付= 0/8月/ 2016 = 31/7月/ 2016
  • ログの詳細
     

  • 月を9月、日付= 31/9月/ 2016 = 1/10/2016に設定します。 0に

  • 設定した日付、日付= = 30/9月/ 2016 0/10月/ 2016
  • ログ詳細 - "8月" は、この問題を解決するために30日

を持つものとして記録され、setDate(1)を呼び出しますループを開始するときに、月を設定するときにオーバーフローの問題が発生しないようにします。