Java 1.5 Calendário # compareTo () confusão
-
22-08-2019 - |
Pergunta
Ok, estou oficialmente perplexo sobre este. Eu tenho um objeto GregorianCalendar que eu gostaria de determinar se ele está no passado, presente ou futuro. Até agora, a docs Calendário # compareTo são confusas para mim, em que estou obtendo resultados erráticos. A classe simples teste irá ilustrar o meu 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 a saída:
compare datePresent to datePast: 1
compare datePresent to datePresent: 0
compare datePresent to dateFuture: 0
O meu entendimento de compareTo é que a última linha deve ser a -1. Alguém pode me dizer o que estou fazendo de errado?
Solução
Você adicionou 6 meses a datePast
, não dateFuture
. Aqui está o código de trabalho:
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));
}
}
Seus resultados teriam sido inconsistentes, porque às vezes dateFuture
seria mais tarde do que datePresent
, dependendo de quando o relógio interno "marcada".
Além de tudo isso, eu não posso ajudar, mas dar a minha data de Java padrão e aconselhamento tempo: uso Joda Tempo . Não é responsável por este problema específico, embora o fato de que muitos dos tipos são imutáveis ??teria ajudado. Mas, em geral, é uma muito melhor biblioteca.