Путаница в Java 1.5 Calendar#compareTo()
-
22-08-2019 - |
Вопрос
Хорошо, я официально в тупике по этому поводу.У меня есть объект GregorianCalendar, который я хотел бы определить, находится ли он в прошлом, настоящем или будущем.До сих пор Календарь#compareTo документы сбивают меня с толку, поскольку я получаю ошибочные результаты.Простой тестовый класс проиллюстрирует мою проблему:
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));
}
}
И вывод:
compare datePresent to datePast: 1
compare datePresent to datePresent: 0
compare datePresent to dateFuture: 0
Насколько я понимаю, CompareTo заключается в том, что последняя строка должна быть -1.Может ли кто-нибудь сказать мне, что я делаю неправильно?
Решение
Вы добавили 6 месяцев к datePast
, нет dateFuture
.Вот рабочий код:
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));
}
}
Ваши результаты были бы противоречивыми, потому что иногда dateFuture
будет позже, чем datePresent
, в зависимости от того, когда «тикали» внутренние часы.
В дополнение ко всему этому, я не могу не дать свой стандартный совет по дате и времени Java:использовать Джода Время вместо.Он не несет ответственности за эту конкретную проблему, хотя тот факт, что многие типы являются неизменяемыми, мог бы помочь.Но в целом это много лучшая библиотека.