Вопрос

Хорошо, я официально в тупике по этому поводу.У меня есть объект 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:использовать Джода Время вместо.Он не несет ответственности за эту конкретную проблему, хотя тот факт, что многие типы являются неизменяемыми, мог бы помочь.Но в целом это много лучшая библиотека.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top