我正在尝试使用 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;
}
}
我无法在谷歌上找到任何相关内容,所以任何帮助都会很棒!
对于 Calendar 类,虽然日和年 编号为
1..n
(从一开始),但月份编号为 0-11
(从零开始),所以 12 月是 不是 月份编号 12
,它是月份号码11
。
尝试调用您的方法,并为月份参数指定
11
(而不是 12
)。
这个问题只是 Calendar 类众多具有挑战性的方面中的一个。
或者,更好的是,使用常数
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;
}
}
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
和SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获取java.time类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如
Interval
、YearWeek
、YearQuarter
和 more。