Java:阳历日历日期验证问题
我想验证一个用户在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;
}
}
我一直没能打开在谷歌任何相关信息,因此任何帮助将是真棒!
与日历类,虽然日子,年岁被编号1..n
(一类),几个月编号0-11
(从零开始),所以十二月不个月数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;
}
}
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类?
-
Java SE 8,Java SE 9,后来
- 内置。
- 带捆绑实现的标准Java API的一部分。
- Java 9增加了一些次要功能和修复。在ThreeTen-Backport
-
Java SE 6和Java SE 7
- 大部分的java.time功能后移植到Java 6 & 7。
-
Android
- 的ThreeTenABP项目适应ThreeTen-反向移植(上述)为Android特异性。
- 请参阅How to use ThreeTenABP…。
的ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。
顺便说一句,您的示例代码无法遵守Java约定进行格式设置。方法名称应以小写字母开头。包括参数的变量也应以小写字母开头。 –