Java 1.5 Calendario # compareTo () confusión
-
22-08-2019 - |
Pregunta
Ok, estoy perplejo oficialmente en este caso. Tengo un objeto GregorianCalendar que me gustaría para determinar si está en el pasado, presente o futuro. Hasta ahora, el docs Calendario # compareTo están confundiendo a mí, en la que estoy recibiendo resultados erráticos. Una clase simple prueba ilustrar mi 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));
}
}
Y la salida:
compare datePresent to datePast: 1
compare datePresent to datePresent: 0
compare datePresent to dateFuture: 0
Mi comprensión de compareTo es que la última línea debe ser un -1. ¿Puede alguien decirme lo que estoy haciendo mal?
Solución
Ha añadido 6 meses a datePast
, no dateFuture
. Aquí está el código de trabajo:
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));
}
}
Sus resultados hubieran sido inconsistente porque a veces dateFuture
sería más tardar datePresent
, dependiendo de cuando el reloj interno "marcada".
Además de todo esto, no puedo dejar de dar mi fecha y hora de Java consejo estándar: use Joda Time lugar. No es responsable para este problema concreto, aunque el hecho de que muchos de los tipos son inmutables habría ayudado. Pero en general se trata de un más mejor biblioteca.