web-dev-qa-db-fra.com

Boucle Javascript entre les dates

Étant donné deux objets Date (), où l'un est inférieur à l'autre, comment puis-je boucler tous les jours entre les dates?

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

}

Est-ce que ce genre de boucle fonctionnerait? Mais comment puis-je ajouter un jour au compteur de boucles?

Merci!

105
Tom Gullen

Voici un moyen de le faire en utilisant le fait que l'ajout d'un jour provoque le report de la date sur le mois suivant, si nécessaire, et sans déconner avec des millisecondes. L'heure d'été n'est pas un problème non plus.

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

Notez que si vous souhaitez stocker la date, vous devez en créer une nouvelle (comme ci-dessus avec new Date(d)), sinon vous obtiendrez chaque date enregistrée comme valeur finale de d dans la boucle.

150
David Johnstone

Basé sur la réponse de 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

Si startDate et endDate sont bien des objets de date, vous pouvez les convertir en nombre de millisecondes à compter du 1er janvier 1970 à minuit, comme suit:

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

Ensuite, vous pouvez passer d’une boucle à l’autre en incrémentant loopTime de 86400000 (1000 * 60 * 60 * 24) - nombre de millisecondes par jour:

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

Je pense avoir trouvé une réponse encore plus simple si vous vous permettez d’utiliser 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
vvo

Voici un code de travail simple, a travaillé pour moi

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

Si vous voulez un moyen efficace en millisecondes:

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

Supposons que vous obtenez la date de début et la date de fin de l'interface utilisateur et que vous les stockez dans la variable scope du contrôleur.

Puis déclarez un tableau qui sera réinitialisé à chaque appel de fonction afin que lors du prochain appel de la fonction, les nouvelles données puissent être stockées.

var dayLabel = [];

N'oubliez pas d'utiliser nouvelle date (votre variable de départ) car si vous n'utilisez pas la nouvelle date et que vous l'affectez directement à la variable, la fonction setDate modifiera la valeur de la variable d'origine à chaque itération "

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

Sur la base de la réponse de Tabare, .__, je devais ajouter un jour de plus à la fin, le cycle étant coupé

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