日付範囲間のJavaScriptループ


135

2つのDate()オブジェクトがあり、一方が他方よりも小さい場合、日付間で毎日ループするにはどうすればよいですか?

for(loopDate = startDate; loopDate < endDate; loopDate += 1)
{

}

この種のループは機能しますか?しかし、ループカウンターに1日を追加するにはどうすればよいですか?

ありがとう!

回答:


200

これは、1日を追加する方法を利用して、必要に応じて日付を翌月にロールオーバーする方法を使用して、ミリ秒をいじることなく行う方法です。夏時間も問題ではありません。

var now = new Date();
var daysOfYear = [];
for (var d = new Date(2012, 0, 1); d <= now; d.setDate(d.getDate() + 1)) {
    daysOfYear.push(new Date(d));
}

日付を保存する場合は、新しいものを作成する必要があります(上記のようにnew Date(d))。そうしないと、保存されたすべての日付がdループの最終値になります。


他のすべての答えよりもはるかに読みやすいです。各ループに86400000ミリ秒を追加しても、あまり読みやすくありません。
オーウェン

1
夏時間に注意してください。d.getDate()+ 1の場合、d.getDate()= GMT Nおよびd.getDate()+ 1 = GMT N-1 d.getDate()+ 1は、同じ月の2日間を返します。
Rafael Fontes 2013年

1
なぜDate.now()定義するのnowですか?new Date() デフォルトでは、現在の日付をオブジェクトとして返します。コンストラクタDateなしで呼び出すnewと、Date文字列が得られ、それをDateオブジェクトに変換しますか?
tatlar 2014

私にとってnew Date(2012, 0, 1);は、間違った日(1日前)を拾っていたので、new Date(Date.UTC(2012, 0, 1))うまくいきました。
Tk421 16

インターネットで複数の解決策を試しました。奇妙なことに、それは時々数日スキップすることです。1.12、2.12、3.12、5.12のように(4.12がスキップされていることに注意してください)なぜそれが起こるのか分かりません...誰かがこの問題を抱えて解決策を見つけましたか?
エリッククビカ2017

73

トム・ガレンの答えに基づいています。

var start = new Date("02/05/2013");
var end = new Date("02/10/2013");


var loop = new Date(start);
while(loop <= end){
   alert(loop);           

   var newDate = loop.setDate(loop.getDate() + 1);
   loop = new Date(newDate);
}

これを使用するには何をインポートする必要がありますか?
DevAllanPer 2018年

3
何@DevAllanPer、Dateグローバルオブジェクトであるdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
ディミトリー・ピーサレフ

9

startDateとendDateが実際に日付オブジェクトである場合、次のように、1970年1月1日の午前0時以降のミリ秒数に変換できます。

var startTime = startDate.getTime(), endTime = endDate.getTime();

次に、loopTimeを86400000(1000 * 60 * 60 * 24)ずつインクリメントしてループすることができます-1日のミリ秒数:

for(loopTime = startTime; loopTime < endTime; loopTime += 86400000)
{
    var loopDay=new Date(loopTime)
    //use loopDay as you wish
}

1
+1、私に取り組むのに十分なものを与えてくれた、私が私の質問に作業解決策を含めた
Tom Gullen

5
これは、夏時間の変更をループする場合には機能しません(それが問題となる領域で)。そうでなければ良い解決策。
チャド

3
864000001日に秒があるとは限りません。このループは、夏時間の変更やその他のエッジ条件に対して脆弱です。
ジェレミーJスターチャー2012

2
DSTの他に、もう1つのエッジ条件は「うるう秒」です。1秒の違い重要です。ミリ秒に変換された日付は、指定された日の最初の秒に対応します。1秒のエラーで前日に着陸します。
Wojtek Kruszewski 2013年

9

Moment.jsの使用を許可すれば、もっと簡単な答えを見つけたと思います。

// cycle through last five days, today included
// you could also cycle through any dates you want, mostly for
// making this snippet not time aware
const currentMoment = moment().subtract(4, 'days');
const endMoment = moment().add(1, 'days');
while (currentMoment.isBefore(endMoment, 'day')) {
  console.log(`Loop at ${currentMoment.format('YYYY-MM-DD')}`);
  currentMoment.add(1, 'days');
}
<script src="https://cdn.jsdelivr.net/npm/moment@2/moment.min.js"></script>


5

ここで私のために働いた簡単な作業コード

var from = new Date(2012,0,1);
var to = new Date(2012,1,20);
    
// loop for every day
for (var day = from; day <= to; day.setDate(day.getDate() + 1)) {
      
   // your day is here

}


2
var start = new Date("2014-05-01"); //yyyy-mm-dd
var end = new Date("2014-05-05"); //yyyy-mm-dd

while(start <= end){

    var mm = ((start.getMonth()+1)>=10)?(start.getMonth()+1):'0'+(start.getMonth()+1);
    var dd = ((start.getDate())>=10)? (start.getDate()) : '0' + (start.getDate());
    var yyyy = start.getFullYear();
    var date = dd+"/"+mm+"/"+yyyy; //yyyy-mm-dd

    alert(date); 

    start = new Date(start.setDate(start.getDate() + 1)); //date increase by 1
}

1

タバレの回答に基づいて、サイクルが前にカットされているので、私は最後にもう1日追加する必要がありました

var start = new Date("02/05/2013");
var end = new Date("02/10/2013");
var newend = end.setDate(end.getDate()+1);
var end = new Date(newend);
while(start < end){
   alert(start);           

   var newDate = start.setDate(start.getDate() + 1);
   start = new Date(newDate);
}


0

UIから開始日と終了日を取得し、それをコントローラーのスコープ変数に格納したとします。

次に、すべての関数呼び出しでリセットされる配列を宣言して、関数の次の呼び出しで新しいデータを保存できるようにします。

var dayLabel = [];

新しい日付(開始変数)を使用することを忘れないでください。新しい日付を使用せずに直接変数に割り当てた場合、setDate関数は各反復で元の変数値を変更します `

for (var d = new Date($scope.startDate); d <= $scope.endDate; d.setDate(d.getDate() + 1)) {
                dayLabel.push(new Date(d));
            }

-2

ジャヤルジョの答えに基づいて:

var loopDate = new Date();
loopDate.setTime(datFrom.valueOf());

while (loopDate.valueOf() < datTo.valueOf() + 86400000) {

    alert(loopDay);

    loopDate.setTime(loopDate.valueOf() + 86400000);
}

これに対するコメントの1つは、!=比較が発生しないため、!=よりも比較が!=よりも優先されるということです。
トムガレン

1
DSTの他に、もう1つのエッジ条件は「うるう秒」です。1秒の違い重要です。ミリ秒に変換された日付は、指定された日の最初の秒に対応します。1秒のエラーで前日に着陸します。
Wojtek Kruszewski 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.