Почему это сравнение Java календаря плохо? - PullRequest
4 голосов
/ 22 марта 2010

У меня возникла необъяснимая проблема с классом Java Calendar, когда я пытаюсь сравнить даты. Я пытаюсь сравнить с календарями и определить, составляет ли их разница> 1 дня, и делать что-то на основе этой разницы или нет. Но это не работает.

Если я сделаю это с двумя датами:

    String currDate = aCurrentUTCCalendar.getTime().toString();
    String localDate = aLocalCalendar.getTime().toString();

Я получаю эти результаты:

    currDate  = "Thu Jan 06 05:58:00 MST 2010"
    localDate = "Tue Jan 05 00:02:00 MST 2010"

Это правильно.

Но если я сделаю это:

    long curr = aCurrentUTCCalendar.getTime().getTime();
    long local = aLocalCalendar.getTime().getTime();

Я получаю эти результаты: (в миллисекундах с начала эпохи)

    curr  = -125566110120000 
    local =  1262674920000 

Поскольку разница между ними составляет всего около 30 часов, величины сильно различаются, не говоря уже о том, что раздражающий негатив знак.

Это вызывает проблемы, если я делаю это:

long day = 60 * 60 * 24 * 1000; // 86400000 millis, one day

if( local - curr > day )
{
    // do something
}

Что не так? Почему вызовы getTime (). ToString () правильные, а вызовы getTime (). GetTime () сильно отличаются?

Я использую jdk 1.6_06 на WinXP. Я не могу обновить JDK по разным причинам.

Ответы [ 3 ]

5 голосов
/ 22 марта 2010

Ваша текущая дата - "B.C.E. 2010-01-06" ( До нашей эры ), то есть 4019 (2x2010 - 1) лет назад.

Попробуйте это:

public class StrangeDate {

  public static void main(String[] args) {
    Date d = new Date(-125566110120000L);
    System.out.println(d.toString());
    //prints 'Thu Jan 06 13:58:00 CET 2010' in my locale

    Calendar c = Calendar.getInstance();
    c.setTime(d);
    c.add(Calendar.YEAR, 4019);

    System.out.println(c.getTime().toString());
    //prints 'Wed Jan 06 13:58:00 CET 2010' in my locale
  }

}

Вопрос: что вы сделали, чтобы получить это aCurrentUTCCalendar?

3 голосов
/ 22 марта 2010

Может быть, тот факт, что на нем напечатано "Tue 5" и "Thu 6", указывает, что что-то не так с вашей датой создания?

ps: не имеет значения, но вместо этого, делая cal.getTime (). GetTime (), вы можете сделать cal.getTimeInMillis ()

0 голосов
/ 25 марта 2010

Ответом было использование класса JodaTime. Спасибо за вступление, было гораздо проще получить желаемые результаты, а не сложные в использовании Java.

Я оставляю это как одну из странностей тех классов Java.Util.Date и Java.Util.Calendar.

Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...