2010-01-15 9 views
7

Mam datę początkową i końcową. Muszę iterować przez każdy dzień pomiędzy tymi 2 datami.Potrzebuję cyklu, który przechodzi przez przedział czasu

Jaki jest najlepszy sposób na zrobienie tego?

mogę zaproponować tylko coś takiego:

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

Odpowiedz

13

gotowy do uruchomienia ;-)

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

Twoja odpowiedź uratowała mi życie !!! – NinjaBoy

3

użyć obiektu Kalendarz jeśli chcesz manipulować dat.

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

Albo użyć Joda Time

6

Ditto na tych, mówiąc użyć obiektu Kalendarz.

Możesz napotkać zaskakujące problemy, jeśli spróbujesz użyć obiektu Date i dodasz do niego 24 godziny.

Oto zagadka dla Ciebie: Jaki jest najdłuższy miesiąc w roku? Możesz myśleć, że nie ma odpowiedzi na to pytanie. Siedem miesięcy ma po 31 dni, więc wszystkie są tej samej długości, prawda? Cóż, w Stanach Zjednoczonych byłoby prawie dobrze, ale w Europie byłoby źle! W Europie październik to najdłuższy miesiąc. Ma 31 dni i 1 godzinę, ponieważ Europejczycy ustawiają swoje zegary z powrotem na 1 godzinę na czas letni w październiku, co oznacza, że ​​jeden dzień w październiku trwa 25 godzin. (Amerykanie rozpoczynają teraz DST w listopadzie, który ma 30 dni, więc listopad jest jeszcze krótszy niż październik lub grudzień.) Sprawia to, że zagadka nie jest tak zabawna dla Amerykanów.)

Kiedyś wpadłem w kłopoty, robiąc dokładnie to, próbowałem: użyłem obiektu Date i dodałem do niego 24 godziny w pętli. Działało tak długo, jak długo nie przekraczałem granic czasu letniego. Ale kiedy to zrobiłem, nagle opuściłem dzień lub dwa razy uderzyłem tego samego dnia, ponieważ Północ marca 8, 2009 + 24 godziny = 1:00 rano 10 marca. Odłóż ten czas, tak jak ja to robiłem, a 9 marca został w tajemniczy sposób pominięty . Podobnie północ 1 listopada 2009 + 24 godziny = 11:00 PM 1 listopada, a my dwukrotnie uderzyliśmy 1 listopada.

+0

dziękuję za twój wkład. – Roman

+0

Interesujące, ale ludzie głosują bardziej za "gotowy do uruchomienia" kod :) –

+0

Stacker podał już kod. Próbowałem tylko wyjaśnić, DLACZEGO to była właściwa odpowiedź, a pomysł PO nie zadziałałby. Oczywiście, przykład działającego kodu jest dobrą rzeczą, ale dopóki nie zrozumiesz, dlaczego to działa, powoduje to tylko natychmiastowy problem. Następnym razem, gdy pojawi się podobny, ale nie identyczny problem, znowu utkniesz. :-) – Jay

Powiązane problemy