2010-12-03 37 views
92

Étant donné deux objets Date(), où l'un est inférieur à l'autre, comment est-ce que je boucle tous les jours entre les dates?Boucle Javascript entre plages de dates

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

} 

Ce type de boucle fonctionnerait-il? Mais comment puis-je ajouter un jour au compteur de boucle?

Merci!

Répondre

120

Voici un moyen de le faire en utilisant la façon dont l'ajout d'un jour entraîne le report de la date au 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 enregistrer la date, vous devrez faire une nouvelle (comme ci-dessus avec new Date(d)), ou bien vous vous retrouverez avec chaque date stockée étant la valeur finale de d dans la boucle.

+0

Tellement plus lisible que toutes les autres réponses. L'ajout de 86400000 milisecondes à chaque boucle n'est pas très lisible. – Owen

+1

Soyez prudent avec les heures d'été. d.getDate() + 1 lorsque d.getDate() = GMT N et d.getDate() + 1 = GMT N - 1 d.getDate() + 1 renvoie deux fois le même jour du mois. –

+1

Pourquoi 'Date.now()' lors de la définition de 'now'? 'new Date()' [renvoie la date actuelle en tant qu'objet par défaut] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date). Appeler 'Date' sans le constructeur' new' vous donne juste une chaîne Date que vous convertissez en un objet Date quand même? – tatlar

9

Si startDate et endDate sont en effet des objets de date, vous pouvez les convertir en nombre de millisecondes depuis minuit le 1er janvier 1970 à ce genre:

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

Ensuite, vous pourriez créer une boucle de l'un à l'autre incrémenter LOOPTIME par 86.400.000 (1000 * 60 * 60 * 24) - nombre de millisecondes en un jour:

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

+1, m'a donné assez pour travailler, j'ai inclus la solution de travail dans ma question –

+5

cela ne fonctionne pas lorsque vous passez en boucle après un changement d'heure d'été (dans les zones où cela pose problème). Bonne solution sinon. – chadgh

+2

Vous ne pouvez pas supposer qu'il y a '86400000' secondes dans une journée. Cette boucle est fragile aux changements d'heure d'été et autres conditions de bord. –

-3

sur la base de la réponse de Jayarjo:

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

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

    alert(loopDay); 

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

Un commentaire à ce sujet est que moins de comparaison est préférée sur! =, Comme lorsque boucle sur plusieurs mois pour une raison quelconque la comparaison! = Ne se déclenche jamais. –

+0

Outre DST, une autre condition de bord est "Leap Second". Une différence d'une seconde * importe * - Les dates converties en millisecondes correspondent à la première seconde d'un jour donné. Une seconde erreur et vous atterrissez le jour précédent. –

59

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

Basé sur la réponse de Tabare, je devais ajouter un jour à la fin, étant donné que le cycle est coupé avant

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

Code de travail Ici simple, a fonctionné 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 
 

 
}