簡體   English   中英

Java:公歷日歷驗證問題

[英]Java: Gregorian Calendar date validation issue

我正在嘗試使用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;  
        }  
}

我無法在谷歌上發現任何相關內容,所以任何幫助都會很棒!

隨着日歷類,雖然日子,年歲編號1..n (一類),幾個月編號0-11 (從零開始),所以十二月不是一個月數12 ,它是月號11

嘗試調用您的方法為month參數指定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及更高版本中。 這些類取代了麻煩的舊遺留日期時間類,如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。 規范是JSR 310

從哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM