webentwicklung-frage-antwort-db.com.de

Javascript-Schleife zwischen Datumsbereichen

Wie kann ich bei zwei Date () - Objekten, bei denen eines kleiner als das andere ist, täglich zwischen den Datumsangaben eine Schleife ausführen?

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

}

Würde diese Art von Schleife funktionieren? Wie kann ich jedoch einen Tag zum Schleifenzähler hinzufügen?

Vielen Dank!

105
Tom Gullen

Hier ist eine Möglichkeit, dies zu tun, indem Sie die Art und Weise verwenden, wie das Hinzufügen eines Tages dazu führt, dass das Datum bei Bedarf auf den nächsten Monat verschoben wird, ohne dass dabei Millisekunden verwendet werden. Auch die Sommerzeit ist kein Thema.

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));
}

Beachten Sie, dass Sie, wenn Sie das Datum speichern möchten, ein neues erstellen müssen (wie oben bei new Date(d)), oder dass am Ende jedes gespeicherte Datum der letzte Wert von d in der Schleife ist.

150
David Johnstone

Basierend auf der Antwort von Tom Gullen.

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);
}
64
Tabares

Wenn startDate und endDate tatsächlich Datumsobjekte sind, können Sie sie in Millisekunden seit dem 1. Januar 1970 um Mitternacht konvertieren.

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

Dann könnten Sie eine Schleife von einer zur anderen durchlaufen, wobei loopTime um 86400000 (1000 * 60 * 60 * 24) erhöht wird - Anzahl der Millisekunden an einem Tag:

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

Ich glaube, ich habe eine noch einfachere Antwort gefunden, wenn Sie Moment.js verwenden:

// 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/[email protected]/moment.min.js"></script>

5
vvo

Hier funktionierte einfacher Code für mich

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
Amr Ibrahim
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
Salim

Wenn Sie einen effizienten Weg mit Millisekunden wünschen:

var daysOfYear = [];
for (var d = begin; d <= end; d = d + 86400000) {
    daysOfYear.Push(new Date(d));
}

Angenommen, Sie haben das Start- und Enddatum von der Benutzeroberfläche abgerufen und in der Bereichsvariablen im Controller gespeichert.

Deklarieren Sie dann ein Array, das bei jedem Funktionsaufruf zurückgesetzt wird, damit beim nächsten Aufruf der Funktion die neuen Daten gespeichert werden können.

var dayLabel = [];

Denken Sie daran, neues Datum (Ihre Startvariable) zu verwenden, da die setDate-Funktion den ursprünglichen Variablenwert in jeder Iteration ändert, wenn Sie das neue Datum nicht verwenden und es direkt der Variablen zuweisen

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

Basierend auf Tabares Antwort musste ich am Ende noch einen Tag hinzufügen, da der Zyklus zuvor unterbrochen wurde

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);
}