我正在尝试使用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;
}
}
我无法在谷歌上发现任何相关信息,所以任何帮助都会很棒!
答案 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)
LocalDate.of( year , month , dayOfMonth ) // Catch exception `DateTimeParseException`
现代方法使用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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。