5

(最初に、私の悪い英語で申し訳ありません、私は初心者です)

日付ごとのパーセントのグラフがあります。現在の週の毎日を x 軸に表示したいと思います。

そこで、週の7日を取得する方法を見つけようとしました。それは私が持っているものです:

var curr = new Date; // get current date
var first = curr.getDate() - curr.getDay();//to set first day on monday, not on sunday, first+1 :

var firstday = (new Date(curr.setDate(first+1))).toString();

for(var i = 1;i<7;i++){
var next = first + i;
var nextday = (new Date(curr.setDate(next))).toString();
alert(nextday);
}

アラートは順調に始まります...月末まで。それが私が得たものです:

1 : "Mon 27 Feb 2012 ..."
2 : "Tue 28 Feb 2012 ..."
3 : "Wed 29 Feb 2012 ..."
4 : "Thu 01 Mar 2012 ..."
5 : "Sat 31 Mar 2012 ..."
6 : "Sun 01 Apr 2012 ..."

ご覧のとおり、金曜日に切り替えて...奇妙なことに、4週間後に適切な日付に切り替えます...

それで、あなたは私にとってより良い解決策を持っていますか、それとも私を助けて何が問題なのかを教えていただけますか.

ありがとうございました!

4

5 に答える 5

3

残念ながら、あなたはオブジェクト ミューテーションの数多くの罠の 1 つに陥っています。:)

問題は、「var nextday = ...」の行で、 setDate ()を呼び出して、反復ごとに「curr」に保存された日付を変更していることです。nextが当月の範囲内にある限り問題ありません。この場合、 curr.setDate(next)は 1 つ先に進むことに相当します。

問題は、nextが 30 に達したときに始まります。2 月 30 日がないため、setDate()は翌月にラップアラウンドし、3 月 1 日になります。これまでのところは問題ありません。残念ながら、次の反復ではcurr.setDate(31)が呼び出され、currは 3 月 1 日であるため ( currによって参照されるオブジェクトは各反復で変更されることに注意してください)、3 月 31 日になります。他の奇妙な値も同じように説明できます。

これを修正する方法は、次のように、反復ごとにcurrをコピーしてからsetDate()を呼び出すことです。

for (var i = 1; i < 7; i++) {
    var next = new Date(curr.getTime());
    next.setDate(first + i);
    alert(next.toString());
}
于 2012-02-29T15:43:19.433 に答える
1

ありがとうございますcurr。値を変更するたびにそれが問題であることを理解しました。あなたのソリューションはすべて機能していますが、同じ問題を抱えている他の人のためにそこにコピーする、@denisw からの最も単純なものを優先します。

var curr = new Date; // get current date
var first = curr.getDate() - curr.getDay();
var firstday = (new Date(curr.setDate(first+1))).toString();
for(var i = 1; i < 7; i++) {
   var next = new Date(curr.getTime());
   next.setDate(first+i);
   alert(next.toString());                            
}

繰り返しになりますが、迅速な回答とご協力に感謝します。

于 2012-03-01T08:52:59.940 に答える
0

問題は、日付の変更currと新しい日付の作成を同時に行っていることです。これを行うには、次の 2 つの方法があります。

日付オブジェクトを決して変更せず、curr新しい日付を作成してください:

var msInDay = 1000 * 60 * 60 * 24;

function addDays(date, days) {
  return new Date(date.getTime() + days * msInDay);        
}

var curr = new Date();

var first = addDays(curr, -curr.getDay() + 1);

alert(first);

for(var i = 1; i<7; i++) {
    var next = addDays(first, i);
    alert(next);
}

または、curr日付オブジェクトを一貫して変更します。

var curr = new Date();

curr.setDate(curr.getDate() - curr.getDay() + 1);

alert(curr);

for(var i = 1; i<7; i++) {
    curr.setDate(curr.getDate() + 1);
    alert(curr);
}

​
于 2012-02-29T15:42:43.713 に答える
0

dateとを追加できdayます。前者は 1 から 28..31 まで、後者は 0 から 6 までです。日付を -3 に設定した場合、Date 型は何をすべきでしょうか?

解決策は、すべての値をミリ秒に変換することです。

var ONE_DAY_IN_MILLIS = 1000*60*60*24;

var curr = new Date();

// Get offset to first day of week
// Note: Depending on your locale, 0 can be Sunday or Monday.
var offset = curr.getDay() * ONE_DAY_IN_MILLIS;

// Date at the start of week; note that hours, minutes and seconds are != 0
var start = new Date( curr.getTime() - offset );

for( var i=0; i<7; i++ ) {
    var nextDay = new Date( start.getTime() + ( i * ONE_DAY_IN_MILLIS ) );
    ...
}
于 2012-02-29T15:40:05.267 に答える