2015-04-22 79 views
1

我有以下代碼檢查有效日期格式驗證檢查日期格式不按預期工作

private void validateDate(String date){ 

    try { 
     String validDate = "MM/dd/yyyy";  
     SimpleDateFormat format = new SimpleDateFormat(validDate); 
     format.setLenient(false); 
     Date theDate = new Date(); 
     theDate = format.parse(date); 
    } 
    catch (Exception e) { 
    } 

} 

我傳遞的日期值06/25/20014。在今年的格式是錯誤的,我期待它會拋出異常,並將進入捕獲,但它從來沒有發生,併成功地通過了代碼format.parse(date);由於我的應用程序沒有拋出錯誤。

我也調試了行format.parse(date);並且它返回「Fri Jul 31 00:00:00 MST 20015」。我不知道爲什麼那條線沒有拋出任何異常。

感謝您的幫助!

+0

6月25日'20014'將HAP筆... – Reimeus

+0

另外,我可能會咆哮,但即使它會拋出一個異常,它將不會有太多使用該空的catch塊 – Morfic

回答

0

這實際上是documented behaviour(至少對於格里高利曆,我以爲你會使用,除非你明確地將其設置爲不同的日曆):

年份:如果格式化的日曆是公曆,應用以下規則 。

對於格式化,如果模式 的字符數爲2,則年份被截斷爲2位;否則就是 解釋爲一個數字。對於解析,如果模式字母 的數量大於2,則對字面解釋年,而不管 位數

是的,20015可能會有一天是有效的年份;)如果你想檢查正好4位數,你可能要考慮使用正則表達式匹配之前解析。

+0

謝謝。那麼有沒有其他方式來驗證日期? – user2810293

+0

你在哪裏看到日曆課程? – MaxZoom

+0

@MaxZoom:真的,無處。但是由於公曆是最常見的違約,所以我覺得很確定。 – Marvin

0

如果這行確實會拋出異常,那麼您的程序將在9999年後停止工作,這通常不是您想要的。當然,你不希望你的計劃持續這麼長時間,但人們並沒有預料到也會持續到2000年。所以Java的選擇在任何時候都不會阻塞似乎是合理的。

如果你想檢查年度爲1和9999之間,你可以只寫一個if:(看相關的問題I want to get Year, Month, Day, etc from Java Date to compare with Gregorian Calendar date in Java. Is this possible?

Calendar cal = Calendar.getInstance(); 
cal.setTime(date); 
if (cal.get(Calendar.YEAR) > 9999) 
    throw new RuntimeException("Blah"); 
0

在標準日期格式的SimpleDateFormat,數字「Y」不一定對應於數字的數量(它不是一個正則表達式)。一個或兩個y是2位數年份的指標(15,98等),3個或更多y是全年的指標。

0

我可以看到,提供的日期是有效的(雖然未來18K歲)

public static void validateDate(String date){ 

    try { 
     String validDate = "MM/dd/yyyy";  
     SimpleDateFormat format = new SimpleDateFormat(validDate); 
     format.setLenient(false); 
     Date theDate = format.parse(date); 
     Calendar c = new GregorianCalendar(); 
     c.setTime(theDate); 
     int year = c.get(Calendar.YEAR); 
     int month = c.get(Calendar.MONTH); 
     int day = c.get(Calendar.DAY_OF_MONTH); 
     int pos = c.get(Calendar.DAY_OF_WEEK); 
     if (Calendar.WEDNESDAY == pos) 
      System.out.print("day is Wednesday on " + year + "/" + (month+1) + "/" + day); 
    } 
    catch (Exception e) { 
     System.out.print("Inside exception block " + e); 
    } 
} 

打印:天是星期三在20014/6/25

如果你需要一些年的驗證,您可以添加額外的檢查

if (year > MAX_YEAR) { 
    // add error here 
} 

這裏是DEMO