2015-04-13 71 views
0

我在Java中將我的日期字段更改爲字符串時遇到問題。它在我的輸出toString中工作,但驗證片不能識別。我的代碼有什麼問題?我無法讓用戶發佈除真正的「M/d/yyyy」日期之外的任何內容,但我的驗證無效。思考?Java日期到字符串解析/驗證幫助需要

我已經發布了下面的開始日期代碼,「結束日期」代碼是相同的,但認爲你應該知道它存在。

非常感謝提前。

 String stringStartDate = this.txtStartDate.getText(); 
     SimpleDateFormat formatter = new SimpleDateFormat("M/d/yyyy"); 
     Date pStartDate = null; 

     if (stringStartDate.length() > 0) 
     { 
      try { 
       pStartDate = formatter.parse(stringStartDate); 
      } catch (ParseException e1) { 
       e1.printStackTrace(); 
      } 

      if (pStartDate == null) 
      { 
      this.textArea.setText(this.textArea.getText() + "\n" 
       + "Error! Please enter a valid start date in the format M/d/yyyy (e.g. 1/2/2015)!"); 
      return; 
      } 
     } 
     else 
     { 
      this.textArea.setText(this.textArea.getText() + "\n" 
      + "Error! Please enter a valid start date in the format M/d/yyyy (e.g. 1/2/2015)!"); 
      return; 
     } 

這是我的toString()...這是完美的工作。

@Override 
    public String toString(){ 
    return "Pay Period Start Date = " +  simpleDateFormatMonthDayYear.format(this.pStartDate) + "\n" 
      + "Pay Period End Date = " + simpleDateFormatMonthDayYear.format(this.pEndDate) + "\n"; 

    } 

從評論和我自己的試驗和錯誤我已經改變了一些事情,但現在都沒有工作。這筆交易是什麼?

 SimpleDateFormat simpleDateFormatMonthDayYear = new SimpleDateFormat("M/d/yyyy"); 
     String stringStartDate = simpleDateFormatMonthDayYear.format(this.txtStartDate.getText()); 
     Date pStartDate = null; 

     if (stringStartDate.length() > 0) 
     { 
      try { 
       pStartDate = simpleDateFormatMonthDayYear.parse(stringStartDate); 
      } catch (ParseException e1) { 
       e1.printStackTrace(); 
      } 

      if (pStartDate == null) 
      { 
      this.textArea.setText(this.textArea.getText() + "\n" 
       + "Error! Please enter a valid start date in the format M/d/yyyy (e.g. 1/2/2015)!"); 
      return; 
      } 
     } 
     else 
     { 
      this.textArea.setText(this.textArea.getText() + "\n" 
      + "Error! Please enter a valid start date in the format M/d/yyyy (e.g. 1/2/2015)!"); 
      return; 
     } 
+0

我注意到,工作使用一個'simpleDateFormatMonthDayYear'而不使用'formatter'的那個。兩種格式都一樣嗎?你有沒有驗證你想要解析的輸入?你有沒有用調試器進入代碼? –

+0

您是否考慮過使用['JFormattedTextField'](http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html)或['JSpinner'](http://docs.oracle.com /javase/tutorial/uiswing/components/spinner.html)而不是?他們可以自動執行驗證,或者您(假設您使用Swing) – MadProgrammer

+0

@ElliottFrisch,當我更改爲simpleDateFormatMonthDayYear時,它似乎變得更糟。 Thoguhts?我已經完成了一步調試器的步驟,但無濟於事。 –

回答

2

您正在嘗試使用SimpleDateFormat格式化String ...

SimpleDateFormat simpleDateFormatMonthDayYear = new SimpleDateFormat("M/d/yyyy"); 
String stringStartDate = simpleDateFormatMonthDayYear.format(field.getText()); 

這根本沒有意義。你想在StringparseDate

你想要做的就是parseString價值爲Date,這將檢查,看看是否String是正確的格式的第一件事。一旦你做到了這一點,你要檢查,看看是否解析Date的格式化版本等於在字段中的文本,看看日期實際上是有效...

SimpleDateFormat simpleDateFormatMonthDayYear = new SimpleDateFormat("M/d/yyyy"); 
try { 
    Date date = simpleDateFormatMonthDayYear.parse(field.getText()); 

    if (date != null) { 

     String formatted = simpleDateFormatMonthDayYear.format(date); 
     if (!formatted.equals(field.getText())) { 

      System.out.println("Date is not valid"); 

     } 

    } else { 

     System.out.println("Error! Please enter a valid start date in the format M/d/yyyy (e.g. 1/2/2015)!"); 

    } 
} catch (ParseException exp) { 

    System.out.println("Error! Please enter a valid start date in the format M/d/yyyy (e.g. 1/2/2015)!"); 

} 

但我倒是隻使用JSpinnerJFormattedTextField因爲這些可以自動有效的文本本身,而是這只是我(或JXDatePicker從的SwingLabs SwingX庫,因爲我只是懶惰)

+0

謝謝,MadProgrammer。我改變了我的想法,看起來很有效。這看起來很好,但我會開始潛入JXDatePicker ......看起來更加理想。 –

+0

很高興它可以幫助;) – MadProgrammer

+0

哦,你搖滾! –

0

您沒有告訴我們該方法失敗的測試。我通常在代碼中發現錯誤的方法是測試,找到失敗的測試輸入,用調試器遍歷它並查看失敗的位置。

但是,這裏是一個提示。我注意到你正在使用「M/d/yyyy」格式。這是有問題的,因爲有些月份有兩位數字,有些日子有兩位數字。爲什麼不使用「MM/dd/YYYY」?

+0

*「爲什麼不使用」MM/dd/YYYY「」* - 由於在將​​'String'解析爲'Date'時格式不那麼重要,並且解析器將考慮單個格式密鑰所在的多個數字目前和其次,'Y'是一年中的一週,而不是一年...... – MadProgrammer