2016-02-13 55 views
0

我正在開發一個項目,我需要根據長度和模式驗證多個日期。我正在使用簡單的日期格式,並發現許多問題。我的要求是嚴格允許日期字符串匹配「yyyy/MM/dd」和嚴格的10個字符。簡單日期格式問題Java

以下代碼未給出各種測試輸入字符串的預期結果。

public static boolean checkformat(String dateString){ 
     boolean flag = false; 
     Date d1 = null; 
     SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); 
     format.setLenient(false); 
     try { 
      d1 = format.parse(dateString); 
      flag=true; 
     } catch (ParseException ex) { 
      ex.printStackTrace(); 
      return false; 
     } 
     return flag; 
    } 

上面的代碼返回關於各種輸入,比如「99/03/1」「真」(應0099/03/01)和99/1/1(應當0099/01/1) 。由於輸入的字符串不是從一個來的,所以我不能執行驗證,然後再將它們傳遞給此方法。請建議對dateformat(「yyyy/MM/dd」)採取非常嚴格的措施。

+0

我已經嘗試過這個實現,並且它沒有像上面提到的輸入那樣工作。 – Kiran

回答

0

好的,第一:你知道你期待的格式。那麼爲什麼要解析它並捕獲異常而不是檢查先決條件?

if(dateString.size() > 10) { 
... 

什麼你實際上做的是不檢查您輸入的格式,而是解析它 - 雖然該方法並不表示此合同 - 所以,如果你的方法就是檢查你可以:1。 使用正則表達式 2. ...? 我知道在網上提供了很多使用SimpleDateFormat的答案,但是 - 坦率地說 - 他們錯了。 如果我期待給定的格式,例如因爲我知道已經對某些用戶輸入進行了轉換,所以我可以開始解析一個字符串,並且考慮到可能出錯的地方,請捕捉異常。如果我不知道將哪種格式傳遞給我,我處於驗證層,並且此層不應該嘗試執行轉換,而是證明轉換是有效的。

1

我建議你在格式化之前試着用正則表達式來驗證日期。

用戶下面的代碼驗證

public static boolean checkformat(String dateString){ 
     boolean flag = false; 
     Date d1 = null; 
     SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); 
     format.setLenient(false); 
     try { 
      if (dateString.matches("([0-9]{4})/([0-9]{2})/([0-9]{2})")) { // use this regex 
       d1 = format.parse(dateString); 
       flag=true; 
      } 
     } catch (ParseException ex) { 
      ex.printStackTrace(); 
      return false; 
     } 
     return flag; 
    } 
+0

感謝您的建議。可以用上面的代碼覆蓋simpledateformat方法。因爲我必須在我的項目的許多地方進行檢查。我正在驗證某些方法中的多個日期。它很難在每個日期添加此檢查。但如果重寫是不可能的,我將與您的解決方案..感謝 – Kiran

+0

在這種情況下,你可以創建一個你自己的自定義方法,這是返回你驗證以及日期格式。在這個方法中你可以使用上面的代碼。這可能會幫助你。 –

0

你可以嘗試使用新的java.time包從Java 8和更高版本。您可以使用它來替換SimpleDateFormat:

public static boolean checkformat(String dateString){ 
    boolean flag = false; 

    try { 
     TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyyMMdd").parse(strDate); 
     flag=true; 
    } catch (DateTimeParseException ex) { 
     ex.printStackTrace(); 
     return false; 
    } 
    return flag; 
} 

這也會限制從無意義的值(例如月份值爲18)。

0
String[] removeSlashes=new String[3]; 
removeSlashes = enteredDate.split("/"); 

if(removeSlashes[0].length()!=4) 
    throw new IncorrectDateFormatException(); // user defined exception 
if(removeSlashes[1].length()!=2) 
    throw new IncorrectDateFormatException(); 
if(removeSlashes[2].length()!=2) 
    throw new IncorrectDateFormatException(); 

//Then use SimpleDateFormat to verify 
+0

通過這樣做,您可以驗證用戶輸入的年份有4個數字,月份有2個數字,日期有2個數字。 –