161

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

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

}

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

ありがとう!

4

10 に答える 10

259

これを行う方法は、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

于 2012-04-06T07:49:34.457 に答える
83

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

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);
}
于 2013-02-01T21:51:57.030 に答える
15

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>

于 2018-04-01T21:01:56.470 に答える
11

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

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

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

for(loopTime = startTime; loopTime < endTime; loopTime += 86400000)
{
    var loopDay=new Date(loopTime)
    //use loopDay as you wish
}
于 2010-12-03T11:36:26.777 に答える
8

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

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

}

于 2017-12-07T20:32:54.500 に答える
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
}
于 2014-11-06T09:49:05.703 に答える
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);
}
于 2017-02-21T22:28:08.917 に答える
0

ミリ秒単位の効率的な方法が必要な場合:

var daysOfYear = [];
for (var d = begin; d <= end; d = d + 86400000) {
    daysOfYear.push(new Date(d));
}
于 2019-01-25T18:20:26.680 に答える
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));
            }
于 2019-07-19T05:24:12.983 に答える
-2

Jayarjoの答えに基づく:

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

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

    alert(loopDay);

    loopDate.setTime(loopDate.valueOf() + 86400000);
}
于 2010-12-03T12:01:26.963 に答える