2011-05-05 132 views
1

我的應用程序需要像這樣的「2002-10-15 10:55:01.000000」字符串。我需要驗證該字符串對於db2時間戳是否有效。如何驗證時間戳?

我該怎麼做?

編輯:這主要是工作

 public static boolean isTimeStampValid(String inputString) { 
    SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS"); 
     try { 
      format.parse(inputString); 
      return true; 
     } catch (ParseException e) { 
      return false; 
     } 
    } 

的問題是,如果我通過它毫秒像一個壞的格式爲「2011-05-02 10:10:01.0av」這將通過驗證。我假設,由於第一個毫秒字符是有效的,它只是截斷了字符串的其餘部分。

回答

2

我並不完全確定的格式,但你可以圍繞它玩,可以嘗試這樣的事情

public static bool isTimeStampValid(String inputString) 
{ 
    SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS"); 
    try{ 
     format.parse(inputString); 
     return true; 
    } 
    catch(ParseException e) 
    { 
     return false; 
    } 
} 

編輯:如果你想驗證成功後,解析數字,你可以做

 format.parse(inputString); 
     Pattern p = Pattern.compile("^\\d{4}[-]?\\d{1,2}[-]?\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}[.]?\\d{1,6}$"); 
     return p.matcher(inputString).matches(); 

代替

format.parse(inputString); 
    return true; 
+0

我相信它拋出ParseException沒有出現FormatException – JustinKSU 2011-05-05 18:21:02

+0

看到我的編輯以上 – Bill 2011-05-06 13:57:43

+0

@Bill你是正確的,貌似還有一些截斷在解析回事(),但你可以使用正則表達式來驗證電話後位解析()。 – 2011-05-06 14:33:52

0

如果您已經連接到數據庫,您可以執行試圖將輸入字符串轉換爲時間戳的查詢,並檢查失敗消息(在本例中爲SQLSTATE 22007)。

VALUES CAST(? AS TIMESTAMP) 

上述查詢將全面驗證輸入字符串,而幾乎不會消耗數據庫服務器上的任何資源。如果字符串由於任何原因而無效,那麼您的數據庫客戶端將遇到異常。

1
/** 
* This method validates the given time stamp in String format 
* @param timestamp 
* @return 
*/ 

public static boolean isTimeStampValid(String timestamp) { 
    //(Considering that formal will be yyyy-MM-dd HH:mm:ss.SSSSSS) 
    //Tokenize string and separate date and time 
    boolean time = false; 
    try { 
      //Tokenize string and separate date and time 
      StringTokenizer st = new StringTokenizer(timestamp, " "); 

      if (st.countTokens() != 2) { 
       return false; 
      } 

      String[] dateAndTime = new String[2]; 

      int i = 0; 
      while (st.hasMoreTokens()) { 
       dateAndTime[i] = st.nextToken(); 
       i++; 
      } 

      String timeToken = dateAndTime[1]; 

      StringTokenizer timeTokens = new StringTokenizer(timeToken, ":"); 
      if (timeTokens.countTokens() != 3) { 
       return false; 
      } 

      String[] timeAt = new String[4]; 
      int j = 0; 
      while (timeTokens.hasMoreTokens()) { 
       timeAt[j] = timeTokens.nextToken(); 
       j++; 
      } 
      try { 
        int HH = Integer.valueOf(timeAt[0].toString()); 
        int mm = Integer.valueOf(timeAt[1].toString()); 
        float ss = Float.valueOf(timeAt[2].toString()); 


        if (HH < 60 && HH >= 0 && mm < 60 && mm >= 0 && ss < 60 && ss >= 0) { 
         time = true; 
        } else { 
        } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      //Got Date 
      String dateToken = dateAndTime[0];//st.nextToken(); 

      //Tokenize separated date and separate year-month-day 
      StringTokenizer dateTokens = new StringTokenizer(dateToken, "-"); 
      if (dateTokens.countTokens() != 3) { 
       return false; 
      } 
      String[] tokenAt = new String[3]; 

      //This will give token string array with year month and day value. 
      int k = 0; 
      while (dateTokens.hasMoreTokens()) { 
       tokenAt[k] = dateTokens.nextToken(); 
       k++; 
      } 

      //Now try to create new date with got value of date 
      int dayInt = Integer.parseInt(tokenAt[2]); 
      int monthInt = Integer.parseInt(tokenAt[1]); 
      int yearInt = Integer.parseInt(tokenAt[0]); 
      Calendar cal = new GregorianCalendar(); 
      cal.setLenient(false); 
      cal.set(yearInt, monthInt - 1, dayInt); 
      cal.getTime();//If not able to create date it will throw error 



    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
    //Here we ll check for correct format is provided else it ll return false 
    try { 
      Pattern p = Pattern.compile("^\\d{4}[-]?\\d{1,2}[-]?\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}[.]?\\d{1,6}$"); 
      if (p.matcher(timestamp).matches()) { 
      } else { 
       return false; 
      } 

    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
    //Cross checking with simple date format to get correct time stamp only 
    SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS"); 
    try { 
      format.parse(timestamp); 
      //return true; 

      if (time) { 
       return true; 
      } else { 
       return false; 
      } 
    } catch (ParseException e) { 
     e.printStackTrace(); 
     return false; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 

}