2012-10-01 81 views
0

這是一個衆所周知的問題,已經出現在stackoverflow上。 我被要求解決Web應用程序中的錯誤。 我有一個來自網絡表單的日期,用戶應該輸入給定格式的有效日期dd/MM/yyyy日期格式轉換在Java中沒有像預期的那樣工作

該應用程序使用Struts 1.3作爲框架,這就是我在驗證相應FormBean的方法時所發現的。

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", aLocale); 
try{ 
    mydate = dateFormat.parse(formDate); 
} 
catch(ParseException pe){ 
    errors.add("error", new ActionError("error.date.invalid")); 
} 

但是它的發生的錯誤不會引發例如,當用戶在短格式輸入年份,即01/10/12,將其轉化爲一個日期,尋找數據庫中,我發現01/10/0012

作爲一個快速解決方案,我嘗試使用setLenient(false),但仍未引發異常,並且mydate仍會導致有效但錯誤的日期。

在討論正則表達式和字符串預解析之前,我想知道我是否錯過了一些東西。特別是在日期格式實例化中使用區域設置時。在項目中使用

最新的JDK是1.5

+0

「aLocale」的價值是什麼? – Azodious

+0

你可以看看http://stackoverflow.com/questions/226910/how-to-sanity-check-a-date-in-java,它有一些想法可能有幫助 – MadProgrammer

回答

0

的問題是,01/10/12滿足dd/MM/yyyy。只是它(正如你所發現的那樣)指的是公元12年。

的選項有:

  1. 有前端濾波或許有JavaScript的評估日期,如果(不允許日期字符串是少於10個字符或以其他方式確保今年是一個合理的範圍之內。)在1900年之前(或者任何看起來不錯的截止日期)向用戶顯示錯誤(或者自動修復,如果這看起來更可取的話,請參閱2以瞭解相關問題)
  2. 解析日期並「修復」任何年份之後評估日期對象明確輸入只有兩個字符(這可能會非常棘手;您如何處理從19XX到20XX的截止?)。
  3. 返回一個異常(大概由UI處理)在某個截止日期之前的任何日期(可能最好與某些客戶端驗證結合使用)
  4. 僅允許通過Web窗口小部件(日期選擇器)輸入日期。

我的投票將是1和3的組合。1表示啓用JavaScript的情況,3表示處理JS驗證失敗的罕見情況。

+0

嗯,我期待setLenient做一個關於輸入格式的檢查,而不是添加兩個零。我無法更改前端架構,所以我想我必須使用正則表達式解析。 – Leonardo

1

您可以使用格式格式,如:

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yy", aLocale); 

所以它會轉換 「01/11/12」,以2012年1月11日和 「86年1月11日」,以1986年1月11日

如果Year是「yyyy」格式而不是字面解釋年份,則無論數字的位數如何。

有關詳細信息閱讀: http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#year

或者,你可以處理在JavaScript/Java代碼中用戶輸入 「DD/MM/YYYY」 格式。限制用戶只能以「dd/mm/yyyy」格式輸入日期。

+0

+1 - 今天我學到了一些新東西... –

相關問題