Java:公历日期验证问题

问题描述 投票:0回答:3

我正在尝试使用 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;  
        }  
}

我无法在谷歌上找到任何相关内容,所以任何帮助都会很棒!

java illegalargumentexception
3个回答
10
投票

对于 Calendar 类,虽然日和年 编号为

1..n
(从一开始),但月份编号为
0-11
(从零开始),所以 12 月是 不是 月份编号
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;  
     }  
 }

1
投票

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 项目现在处于维护模式,建议迁移到 java.time 类。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获取java.time类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如

Interval
YearWeek
YearQuarter
more

© www.soinside.com 2019 - 2024. All rights reserved.