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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top