2010-12-03 22 views
92

Dado dos objetos Date(), donde uno es menor que el otro, ¿cómo bucle todos los días entre las fechas?bucle Javascript entre intervalos de fechas

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

} 

¿Funcionaría este tipo de bucle? Pero, ¿cómo puedo agregar un día al contador de bucles?

Gracias!

Respuesta

120

Aquí hay una manera de hacerlo haciendo uso de la forma en que agregar un día hace que la fecha pase al mes siguiente si es necesario y sin perder milisegundos. Los ahorros de luz diurna tampoco son un problema.

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

Tenga en cuenta que si desea almacenar la fecha, tendrá que hacer una nueva (como anteriormente con new Date(d)), o de lo contrario va a terminar con cada fecha almacenada siendo el valor final de d en el circuito.

+0

Mucho más legible que todas las otras respuestas. Agregar 86400000 milisegundos cada bucle no es muy legible. – Owen

+1

Tenga cuidado con los horarios de verano. d.getDate() + 1 cuando d.getDate() = GMT N y d.getDate() + 1 = GMT N - 1 d.getDate() + 1 devuelve el mismo día del mes dos veces. –

+1

¿Por qué 'Date.now()' cuando se define 'ahora'? 'new Date()' [devuelve la fecha actual como un objeto por defecto] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date). Llamar a 'Date' sin el constructor 'new' solo le da una cadena de fecha que luego convierte a un objeto Date de todos modos? – tatlar

9

Si startDate y endDate son de hecho los objetos de fecha se pueden convertir a número de milisegundos desde la medianoche del 1 Ene de 1970, así:

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

entonces se podría bucle de uno a otro LOOPTIME por incremento a 86,4 millones (1000 * 60 * 60 * 24) - número de milisegundos en un día:

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

+1, me dio suficiente para trabajar, he incluido la solución de trabajo en mi pregunta –

+5

esto no funciona al pasar el horario de ahorro de energía (en áreas donde eso es un problema). Buena solución de lo contrario. – chadgh

+2

No puede suponer que hay '86400000' segundos en un día. Este ciclo es frágil a los cambios de horario de verano y otras condiciones de borde. –

-3

Basado en la respuesta 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 comentario para esto es que se prefiere una comparación inferior a! =, Ya que cuando se repite durante varios meses por alguna razón, la comparación! = Nunca se dispara. –

+0

Además de DST, otra condición de borde es "Leap Second". Una diferencia de un segundo * sí * importa: las fechas convertidas en milisegundos corresponden al primer segundo de un día determinado. Un segundo error y aterrizas el día anterior. –

59

Basado en la respuesta 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

Sobre la base de respuesta de Tabaré, he tenido que añadir un día más al final, ya que el ciclo se corta antes de

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

Aquí sencillo código de trabajo, trabajé para mí

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 
 

 
}

Cuestiones relacionadas