2009-03-27 12 views
1

Ok, ich bin offiziell auf diesem einen ratlos. Ich habe ein GregorianCalendar-Objekt, das ich bestimmen möchte, ob es in der Vergangenheit, Gegenwart oder Zukunft ist. Bisher sind die Calendar#compareTo Dokumente für mich verwirrend, da ich erratische Ergebnisse erhalte. Eine einfache Test Klasse illustriert mein Problem:Java 1.5 Kalender # compareTo() Verwirrung

import java.util.Calendar; 
import java.util.GregorianCalendar; 
public class MyCal 
{ 

     public static void main(String[] args) 
     { 
       GregorianCalendar datePast = new GregorianCalendar(); 
       datePast.add(Calendar.MONTH, -6); // subtract 6 months 
       GregorianCalendar datePresent = new GregorianCalendar(); 
       GregorianCalendar dateFuture = new GregorianCalendar(); 
       datePast.add(Calendar.MONTH, 6); // add 6 months 

       System.out.println("compare datePresent to datePast: "+datePresent.compareTo(datePast)); 
       System.out.println("compare datePresent to datePresent: "+datePresent.compareTo(datePresent)); 
       System.out.println("compare datePresent to dateFuture: "+datePresent.compareTo(dateFuture)); 
     } 
} 

Und die Ausgabe:

compare datePresent to datePast: 1 
compare datePresent to datePresent: 0 
compare datePresent to dateFuture: 0 

Mein Verständnis von compareTo ist, dass die letzte Zeile a -1 sein sollte. Kann mir jemand sagen, was ich falsch mache?

Antwort

2

Sie haben 6 Monate zu datePast hinzugefügt, nicht dateFuture. Hier ist der Arbeitscode:

import java.util.Calendar; 
import java.util.GregorianCalendar; 
public class MyCal 
{ 

    public static void main(String[] args) 
    { 
     GregorianCalendar datePast = new GregorianCalendar(); 
     datePast.add(Calendar.MONTH, -6); // subtract 6 months 
     GregorianCalendar datePresent = new GregorianCalendar(); 
     GregorianCalendar dateFuture = new GregorianCalendar(); 
     dateFuture.add(Calendar.MONTH, 6); // add 6 months 

     System.out.println("compare datePresent to datePast: "+datePresent.compareTo(datePast)); 
     System.out.println("compare datePresent to datePresent: "+datePresent.compareTo(datePresent)); 
     System.out.println("compare datePresent to dateFuture: "+datePresent.compareTo(dateFuture)); 
    } 
} 

Ihre Ergebnisse widersprüchlich gewesen wäre, weil manchmaldateFuture später wäre als datePresent, je nachdem, wann die innere Uhr „abgehakt“.

Zusätzlich zu all dem, kann ich nicht helfen, aber geben Sie meine Standard-Java-Datum und Uhrzeit: Verwenden Sie stattdessen Joda Time. Es ist nicht für dieses spezielle Problem verantwortlich, obwohl die Tatsache, dass viele der Typen unveränderlich sind, geholfen hätte. Aber im Allgemeinen ist es eine viel bessere Bibliothek.

+0

Wow, ich fühle mich lächerlich dumm. Danke Jon. – localshred

+0

Wussten Sie, dass es für niemanden möglich ist, eine Frage zu SO über Java Date oder Kalender zu stellen, ohne dass mindestens eine Person Joda Time erwähnt? Wenn es ein SO-Trinkspiel gäbe, wäre das Regel 1. –

+0

Wenn ich also eine Nachfolgefrage habe, sollte ich eine neue Frage erstellen oder diese ändern? – localshred