2010-01-15 10 views
7

Tengo la fecha de inicio y la fecha de finalización. Necesito repetir todos los días entre estas 2 fechas.Necesito un ciclo que itera a través del intervalo de fechas

¿Cuál es la mejor manera de hacerlo?

puedo sugerir solamente algo como:

Date currentDate = new Date (startDate.getTime()); 
while (true) { 
    if (currentDate.getTime() >= endDate.getTime()) 
     break; 
    doSmth(); 
    currentDate = new Date (currentDate.getTime() + MILLIS_PER_DAY); 
} 

Respuesta

13

listo para correr ;-)

public static void main(String[] args) throws ParseException { 
    GregorianCalendar gcal = new GregorianCalendar(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd"); 
    Date start = sdf.parse("2010.01.01"); 
    Date end = sdf.parse("2010.01.14"); 
    gcal.setTime(start); 
    while (gcal.getTime().before(end)) { 
     gcal.add(Calendar.DAY_OF_YEAR, 1); 
     System.out.println(gcal.getTime().toString()); 
    } 
} 
+0

¡Tu respuesta me salvó la vida! – NinjaBoy

3

Utilice un objeto Calendar si se quiere manipular fechas.

Calendar c = Calendar.getInstance(); 
    // ... set the calendar time ... 
    Date endDate = new Date(); 
    // ... set the endDate value ... 

    while (c.getTime().before(endDate) { 
     // do something 
     c.add(Calendar.DAY_OF_WEEK, 1); 
    } 

o uso Joda Time

6

Ditto en los que afirman utilizar un objeto Calendar.

Puede tener problemas sorprendentes si intenta utilizar un objeto Date y lo agrega 24 horas.

Aquí hay un acertijo para ti: ¿Cuál es el mes más largo del año? Puede pensar que no hay respuesta para esa pregunta. Siete meses tienen 31 días cada uno, por lo que todos tienen la misma longitud, ¿no? Bueno, en los Estados Unidos eso sería casi correcto, ¡pero en Europa sería un error! En Europa, octubre es el mes más largo. Tiene 31 días y 1 hora, porque los europeos configuraron sus relojes en 1 hora para el horario de verano en octubre, lo que hace que un día de octubre dure 25 horas. (Los estadounidenses ahora comienzan el horario de verano en noviembre, que tiene 30 días, por lo que noviembre es aún más corto que octubre o diciembre. Por lo tanto, no es tan divertido para los estadounidenses)

Una vez tuve problemas al hacer exactamente lo que eres tratando de hacer: utilicé un objeto Date y lo agregué 24 horas en un bucle. Funcionó siempre y cuando no cruzara los límites del horario de verano. Pero cuando lo hice, de repente salté un día o golpeé el mismo día dos veces, porque a la medianoche del 8 de marzo de 2009 + 24 horas = 1:00 a.m. del 10 de marzo. Entregué el tiempo, como estaba haciendo, y el 9 de marzo se omitió misteriosamente . Del mismo modo, la medianoche del 1 de noviembre de 2009 + 24 horas = 11:00 p. M. El 1 de noviembre, y acertamos el 1 de noviembre dos veces.

+0

gracias por su adición – Roman

+0

Interesante, pero la gente vota más por el código 'listo para correr' :) –

+0

Stacker ya había dado el código. Solo intentaba explicar POR QUÉ esa era la respuesta correcta y la idea de OP no funcionó. Claro, un ejemplo de código de trabajo es algo bueno, pero a menos que entiendas por qué funciona, solo te permitirá superar el problema inmediato. La próxima vez que aparezca un problema similar pero no del todo idéntico, volverás a estar atascado. :-) – Jay

Cuestiones relacionadas