Java 1.5 Calendario # compareTo () confusione
-
22-08-2019 - |
Domanda
Ok, sono ufficialmente perplesso su questo. Ho un oggetto GregorianCalendar che vorrei per determinare se è nel passato, presente o futuro. Finora, il Calendario # compareTo documenti sono confuso per me, nel senso che sto ottenendo risultati erratici. Una semplice classe di test illustrerà il mio problema:
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));
}
}
E l'uscita:
compare datePresent to datePast: 1
compare datePresent to datePresent: 0
compare datePresent to dateFuture: 0
La mia comprensione di compareTo è che l'ultima riga dovrebbe essere un -1. Qualcuno può dirmi che cosa sto facendo male?
Soluzione
Hai aggiunto 6 mesi a datePast
, non dateFuture
. Ecco il codice di lavoro:
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));
}
}
I tuoi risultati sarebbero stati incoerenti perché a volte dateFuture
sarebbe più tardi datePresent
, a seconda di quando l'orologio interno "spuntata".
In aggiunta a tutto questo, non posso fare a meno di dare la mia data e l'ora standard di Java consiglio: utilizzare Joda Tempo . Non è responsabile di questo particolare problema, anche se il fatto che molti dei tipi sono immutabili avrebbe aiutato. Ma in generale si tratta di un molto migliore biblioteca.