2012-10-11 99 views
0

我想創建一個方法來使用SimpleDateFormat驗證日期。使用SimpleDateFormat驗證日期

如果日期是有效的(例如02/09/20122/09/201202/9/2012),此方法應該返回真正

但是,如果日期的格式錯誤(例如02/09/201X)或邏輯錯誤(例如32/09/2012),此方法應該返回

我嘗試寫這個方法是這樣的:

private boolean isValidDate(String date) { 
     DateFormat df1 = new SimpleDateFormat("dd-MM-yyyy"); 
     DateFormat df2 = new SimpleDateFormat("d-MM-yyyy"); 
     DateFormat df3 = new SimpleDateFormat("dd-M-yyyy"); 
     Date d = null; 
     String s = null; 

     try { 
      d = df1.parse(date); 
     }catch (Exception e1) { 
      try{ 
       d = df2.parse(date); 
      }catch (Exception e2) { 
       try { 
        d= df3.parse(date); 
       }catch (Exception e3) { 
        return false; 
       } 
       s = df3.format(d); 
       return date.equals(s); 
      } 
      s = df2.format(d); 
      return date.equals(s); 
     } 
     s = df1.format(d); 
     return date.equals(s); 
    } 

但是,如果我驗證日期,例如,2/09/2012,它返回(實際上它應該返回)。我不知道爲什麼...任何人都可以找到我的代碼有什麼問題,或者這個邏輯是完全錯誤的?有沒有更好的方法來做這個驗證?

+0

您應該考慮使用java.xml.DatatypeFactory來解析日期字符串。它速度快,支持大量的標準格式。 – Zagrev

回答

2

你輸入的格式爲2012年2月9日不是2012年2月9日,所以你的日期格式應該是象下面這樣:

DateFormat df1 = new SimpleDateFormat("dd/MM/yyyy"); 
    DateFormat df2 = new SimpleDateFormat("d/MM/yyyy"); 
    DateFormat df3 = new SimpleDateFormat("dd/M/yyyy"); 
+0

是的..你說得對,謝謝! – Carter

1

我覺得你的代碼是正確的(但不是很可擴展性 - 嘗試在for循環中執行它以防以後添加更多格式)。

問題是你的格式字符串是錯誤的。而不是dd-MM-yyyy你應該有dd/MM/yyyy。這同樣適用的格式休息:因爲/不是-

DateFormat df1 = new SimpleDateFormat("dd/MM/yyyy"); 
DateFormat df2 = new SimpleDateFormat("d/MM/yyyy"); 
DateFormat df3 = new SimpleDateFormat("dd/M/yyyy"); 
+0

感謝您的建議,我發現使用'setLenient(false)'會縮短代碼,因爲我不需要比較'date.equals(s)'... – Carter

1

驗證失敗。

+0

我的錯..謝謝! – Carter

0

添加這個額外的檢查,分析每個字符串後:

  1. 令牌化的日期字符串的值
  2. 然後使用提取的日,月和年值的使用,以創建一個新的Date對象的GregorianCalendar
  3. 將它與您通過解析日期字符串創建的日期對象進行比較
  4. 如果它們匹配,則您知道輸入字符串包含有效的日期格式
+0

感謝你的建議! – Carter