2

月の日から日付をループで取得しようとしています。コードは最初の数日間は機能し、それ以降はランダムな日付を返します。

ここで何か助けはありますか?

var now = new Date();
var initDate = new Date(now.getYear() + 1900, 0);

for (var i = 1 ; i <366 ; i++) {
    var day = dateFromDay(i, initDate);
    document.write(" Day " + i + " : " + day);
    document.write("<br>");
}

function dateFromDay(day, initDate) {
    var months = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", 
                   "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];

    var cur = new Date(initDate.setDate(day));
    cur = months[cur.getMonth()] + " " + cur.getDate();
    return cur;
}

出力:

...
...
Day 29 : Jan 29
Day 30 : Jan 30
Day 31 : Jan 31
Day 32 : Feb 1
// From here the output gets messed  up
Day 33 : Mar 4
Day 34 : Apr 3
Day 35 : May 5
Day 36 : Jun 5
Day 37 : Jul 7
Day 38 : Aug 7
Day 39 : Sep 8
Day 40 : Oct 10
Day 41 : Nov 10
Day 42 : Dec 12
Day 43 : Jan 12
Day 44 : Feb 13
...
...
4

3 に答える 3

1

setDate()「initDate」変数を呼び出すと、その日付が更新されます。したがって、1月から2月にオーバーフローするとすぐに、次のコールはすぐに翌月に波及します

「initDate」変数は必要ありません。現在の年、1月(0)の月、および任意の曜日番号の関数を呼び出すたびに、新しく作成された日付から開始します。結果のDateインスタンスがあなたの日付になります。

したがって:

function dayNumberToDate( dayNumber ) {
  var thisYear = new Date().getFullYear(); // no need to add 1900
  return new Date(thisYear, 0, dayNumber);
}

alert(dayNumberFromDate( 271 )); // alerts Thu Sep 27 2012 00:00:00 GMT-0500 (CDT) (for me)
于 2012-10-12T13:35:53.150 に答える
0

次の行を変更します。

var cur = new Date(initDate.setDate(day));

これのために:

var cur = new Date();
cur.setDate( initDate.getDate()+day );
于 2012-10-12T13:37:46.770 に答える
0

以下のコードをforループ内でこの行の前に移動しますvar day = dateFromDay(i, initDate);

 var now = new Date();
 var initDate = new Date(now.getYear() + 1900, 0);
于 2012-10-12T13:40:48.590 に答える