2011-10-04 83 views
2

我想验证一个用户在java中使用公历日历(这是必须的)输入的日期,但是每当我在12月测试一个日期时,它会抛出下面的错误。Java:阳历日历日期验证问题

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; 
     } 
} 

我一直没能打开在谷歌任何相关信息,因此任何帮助将是真棒!

+0

顺便说一句,您的示例代码无法遵守Java约定进行格式设置。方法名称应以小写字母开头。包括参数的变量也应以小写字母开头。 –

回答

8

与日历类,虽然日子,年岁编号1..n(一类),几个月编号0-11(从零开始),所以十二月个月数12,它是月数11

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

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

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; 
    } 
} 
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.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore