Java 1.5 Calendar # compareTo () путаница - PullRequest
1 голос
/ 27 марта 2009

Хорошо, я официально поставлен в тупик. У меня есть объект GregorianCalendar, который я хотел бы определить, находится ли он в прошлом, настоящем или будущем. Пока что документы Calendar # 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

Насколько я понимаю, сравнить с тем, что последняя строка должна быть -1. Может кто-нибудь сказать мне, что я делаю не так?

1 Ответ

2 голосов
/ 27 марта 2009

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

...