ClassCastException при сравнении дат? - PullRequest
1 голос
/ 12 января 2012

Я использую GXT / ExtGWT.У меня есть код ниже, который сравнивает две даты.

private DateField startDateField = new DateField();
private DateField endDateField = new DateField();
Date date = new Date();

CalendarUtil.addDaysToDate(date, -1);
startDateField.setValue(date);
endDateField.setValue(new Date());

Date fromDate = startDateField.getValue();
Date toDate = endDateField.getValue();    

Date differenceBetweenDates = new Date(fromDate.getTime());
CalendarUtil.addMonthsToDate(differenceBetweenDates, 6);

if (differenceBetweenDates.before(toDate)) {
    MessageBox.alert("Alert","Date range should not exceed six months", null);
    return false;
} else{ 
    return true;
}

Здесь в полях даты fromdate я выбрал 0012-12-30 и todate как 0012-12-31.

Когда строка differenceBetweenDates.before(toDate) выполнена, я получаю исключение ниже.Пожалуйста, помогите мне.Я что-то здесь не так делаю?

java.lang.ClassCastException: sun.util.calendar.JulianCalendar$Date cannot be cast to sun.util.calendar.Gregorian$Date

Ответы [ 3 ]

3 голосов
/ 12 января 2012

Согласно http://www.docjar.com/html/api/java/util/Date.java.html, java.util.Date содержит этот код:

private static final BaseCalendar getCalendarSystem(long utc) {
  // Quickly check if the time stamp given by `utc' is the Epoch
  // or later. If it's before 1970, we convert the cutover to
  // local time to compare.
  if (utc >= 0
    || utc >= GregorianCalendar.DEFAULT_GREGORIAN_CUTOVER
        - TimeZone.getDefaultRef().getOffset(utc)) {
    return gcal;
 }
 return getJulianCalendar();

}

Так что мне кажется, что, потому что вы вводите год как 0012не 2012, он выбирает JulianCalendar.

1 голос
/ 04 января 2013

У меня та же проблема, но для другого варианта использования (Даты исходят из пользовательского ввода, но источником данных является таблица Excel).

Очень простой обходной путь помог мне:

private static boolean isBefore(Date firstDate, Date secondDate) {
    return firstDate.getTime() < secondDate.getTime();
}
0 голосов
/ 12 января 2012

Ваш анализ даты имеет некоторые проблемы. Что-то думает, что вы намереваетесь представлять время согласно юлианскому календарю Цезаря! Если вы не православный, я сомневаюсь, что это намерение. У endDateField есть некоторая проблема, заключающаяся в манипулировании датами с совершенно неправильным календарем.

...