2010-01-15 4 views
7

Ich habe das Startdatum und das Enddatum. Ich muss jeden Tag zwischen diesen 2 Daten durchlaufen.Ich brauche einen Zyklus, der durch Datenintervall Iteriert

Was ist der beste Weg, dies zu tun?

kann ich nur so etwas wie vorschlagen:

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

Antwort

13

bereit ;-)

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

Ihre Antwort rettete mein Leben !!! – NinjaBoy

3

Verwenden Sie ein Calendar-Objekt, wenn Sie Daten manipulieren wollen.

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

Oder verwenden Joda Time

6

Ditto auf diejenigen laufen sagen ein Calendar-Objekt zu verwenden.

Sie können in überraschende Schwierigkeiten geraten, wenn Sie versuchen, ein Date-Objekt zu verwenden und 24 Stunden hinzuzufügen.

Hier ist ein Rätsel für Sie: Was ist der längste Monat des Jahres? Sie könnten denken, dass es keine Antwort auf diese Frage gibt. Sieben Monate haben jeweils 31 Tage, also sind sie alle gleich lang, oder? Nun, in den USA wäre das fast richtig, aber in Europa wäre es falsch! In Europa ist der Oktober der längste Monat. Es hat 31 Tage und 1 Stunde, weil die Europäer ihre Uhren im Oktober um eine Stunde auf Sommerzeit zurückstellen, so dass ein Tag im Oktober 25 Stunden dauert. (Amerikaner beginnen jetzt Sommerzeit im November, die 30 Tage hat, so November ist immer noch kürzer als Oktober oder Dezember. So machen dieses Rätsel nicht so amüsant für die Amerikaner.)

Ich einmal in Schwierigkeiten geraten, indem Sie genau das, was du bist versuchen zu tun: Ich habe ein Date-Objekt verwendet und 24 Stunden in einer Schleife hinzugefügt. Es funktionierte, solange ich die Grenzen der Sommerzeit nicht überschritten habe. Aber als ich es tat, übersprang ich plötzlich einen Tag oder schlug den gleichen Tag zweimal, denn Mitternacht, 8. März 2009 + 24 Stunden = 1.00 Uhr, 10. März. Die Zeit fallen lassen, wie ich es tat, und der 9. März wurde auf mysteriöse Weise übersprungen . Ebenso Mitternacht 1. November 2009 + 24 Stunden = 11.00 Uhr 1. November, und wir trafen zweimal den 1. November.

+0

danke für deine Ergänzung – Roman

+0

Interessant, aber die Leute wählen mehr für 'ready to run' Code :) –

+0

Stacker hatte den Code bereits gegeben. Ich versuchte nur zu erklären, WARUM das die richtige Antwort war und die OP-Idee würde nicht funktionieren. Sicher, ein Beispiel für Arbeitscode ist eine gute Sache, aber wenn Sie nicht verstehen, warum es funktioniert, bringt es Sie nur über das unmittelbare Problem hinaus. Das nächste Mal, wenn eine ähnliche, aber nicht ganz identische Frage auftaucht, wirst du wieder feststecken. :-) – Jay