2011-10-04 82 views
2

我想驗證一個用戶在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; 
     } 
} 

我一直沒能打開在谷歌任何相關信息,因此任何幫助將是真棒!

+0

順便說一句,您的示例代碼無法遵守Java約定進行格式設置。方法名稱應以小寫字母開頭。包括參數的變量也應以小寫字母開頭。 –

回答

8

與日曆類,雖然日子,年歲編號1..n(一類),幾個月編號0-11(從零開始),所以十二月個月數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; 
    } 
} 
0

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類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore