Java 比较日期时的ClassCastException?

Java 比较日期时的ClassCastException?,java,gwt,gxt,Java,Gwt,Gxt,我正在使用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(ne

我正在使用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;
}
在这里的日期字段中,从日期I选择为
0012-12-30
,到日期为
0012-12-31

当执行(toDate)之前的行
DifferenceBeween.before时,我得到下面的异常。请帮帮我。我做错什么了吗

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

你的约会解析有问题。有些人认为你打算根据凯撒的儒略历法来代表时间!除非你是正统派,否则我怀疑你的意图
endDateField
内部存在一些问题,即使用完全错误的日历处理日期。

您的日期解析存在一些问题。有些人认为你打算根据凯撒的儒略历法来代表时间!除非你是正统派,否则我怀疑你的意图
endDateField
内部存在一些问题,即使用完全错误的日历处理日期。

根据,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。

根据,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。

我有同样的问题,但用于不同的用例(日期确实来自用户输入,但数据源是Excel表)

一个非常简单的解决方法帮了我的忙:

private static boolean isBefore(Date firstDate, Date secondDate) {
    return firstDate.getTime() < secondDate.getTime();
}
private静态布尔值isBefore(日期firstDate,日期secondDate){
返回firstDate.getTime()
我也有同样的问题,但用于不同的用例(日期确实来自用户输入,但数据源是Excel表)

一个非常简单的解决方法帮了我的忙:

private static boolean isBefore(Date firstDate, Date secondDate) {
    return firstDate.getTime() < secondDate.getTime();
}
private静态布尔值isBefore(日期firstDate,日期secondDate){
返回firstDate.getTime()
您在哪个行号收到异常?您好,谢谢您的回复。下面是我收到异常的行。if(differenceBetweenDates.before(toDate))。您收到异常的行号是什么?您好,谢谢您的回复。下面是我得到一个例外的一行。if(differencebetween.before(toDate))。嗨,保罗,谢谢你的回复。请告诉我在这种情况下什么应该是更好的解决方案。感谢您将选择选项改为2012,而不是12,或者在两个日期变量中将2000添加到年份中。嗨,Paul,问题是datefield是可编辑的,因此用户可以编辑任何日期。我们唯一的验证是日期应为yyyy-mm-dd格式。首先要检查的是,如果您在2012-12-30和2012-12-31中输入,您不会看到异常。您是否可以添加验证规则,或者是否可以将用户数限制为一年中的两位数(您可以添加2000位)?我不熟悉GWT。嗨,保罗,如果输入上述值,它需要…没有例外…如果我输入1583年之后的任何日期,它就会工作…如果我输入1583年之前的任何日期,它会给出一个例外…嗨,保罗,谢谢你的回复。请告诉我在这种情况下什么应该是更好的解决方案。感谢您将选择选项改为2012,而不是12,或者在两个日期变量中将2000添加到年份中。嗨,Paul,问题是datefield是可编辑的,因此用户可以编辑任何日期。我们唯一的验证是日期应为yyyy-mm-dd格式。首先要检查的是,如果您在2012-12-30和2012-12-31中输入,您不会看到异常。您是否可以添加验证规则,或者是否可以将用户数限制为一年中的两位数(您可以添加2000位)?我不熟悉GWT。嗨,保罗,如果输入上面的值,它需要..没有例外..如果我输入1583年之后的任何日期,它就会工作..如果我输入1583年之前的任何日期,它会给出一个例外。。。