Java:公历日历验证问题

时间:2011-10-04 00:50:27

标签: java illegalargumentexception

我正在尝试使用java中的公历来验证用户的日期输入(这是必须的),但每当我在12月测试日期时,它会抛出下面的错误。

Exception in thread "main" java.lang.IllegalArgumentException: MONTH   
        at java.util.GregorianCalendar.computeTime(Unknown Source)  
        at java.util.Calendar.updateTime(Unknown Source)  
        at java.util.Calendar.getTimeInMillis(Unknown Source)  
        at java.util.Calendar.getTime(Unknown Source)

下面的代码

public static boolean  ValidDate (int Day, int Month, int Year)  
    GregorianCalendar Date = new GregorianCalendar();  
    Date.setLenient(false);  
    Date.set(Year, Month, Day, 0, 0, 0);  
    try{  
        Date.getTime();  
        return true;  
        }catch (Exception e){  
            System.out.println("Date is invalid please try again");   
            return false;  
        }  
}

我无法在谷歌上发现任何相关信息,所以任何帮助都会很棒!

3 个答案:

答案 0 :(得分:9)

使用Calendar类,虽然日期和年份 编号为1..n(从1开始),但是月份编号为0-11(从零开始),因此12月是< strong>不月份编号12,它是月份编号11

尝试为月份参数调用指定11(而不是12)的方法。

这个问题只是一个中Calendar类的许多延迟方面。

答案 1 :(得分:3)

或者,更好的是,使用常量Calendar.DECEMBER。你不必担心是否有11或12个。

帮自己一个忙:学习并遵循Java编码标准。我会这样写的:

public static boolean  isvalidDate (int day, int month, int year)  
    Calendar calendar = Calendar.getInstance();
    calendar.setLenient(false);  
    calendar.set(year, month, day, 0, 0, 0);  
    try {  
        date.getTime();  
        return true;  
     } catch (Exception e) {  
        return false;  
     }  
 }

答案 2 :(得分:0)

TL;博士

LocalDate.of( year , month , dayOfMonth )  // Catch exception `DateTimeParseException`

java.time

现代方法使用java.time类而不是麻烦的旧GregorianCalendar类。

java.time.LocalDate类表示没有时间且没有时区的仅限日期的值。

要验证输入,请尝试从数字中汇编LocalDate。与GregorianCalendar不同,LocalDate的月份数量合理,1月至12月为1-12。如果这些数字导致无效日期,则会引发DateTimeParseException以便您抓住。

try {
    LocalDate ld = LocalDate.of( year , month , dayOfMonth ) ;
    return true ;  // true = Valid data entered for a date.
} catch ( DateTimeParseException e ) {
    return false;  // Exception caught, meaning invalid data-entry.
}

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore