簡體   English   中英

日期格式轉換在Java中無法按預期工作

[英]Date format conversion not working as expected in Java

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

該應用程序使用Struts 1.3作為框架,這是我在相應FormBean的validate方法中發現的。

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

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

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

因此它將“ 01/11/12”轉換為2012年1月11日,並將“ 01/11/86”轉換為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”格式輸入日期。

問題在於, 01/10/12 dd/MM/yyyy 01/10/12 確實滿足dd/MM/yyyy 只是(您已經發現)它指的是12 AD。

您的選擇是:

  1. 進行前端過濾(不允許日期字符串少於10個字符,否則請確保年份在合理范圍內。)也許讓JavaScript評估日期,並且如果在1900年之前(或看起來不錯的截止日期)顯示錯誤,用戶(或自動修復,如果看起來更可取,請參見2)
  2. 解析日期后評估日期對象,並“固定”任何僅用兩個字符輸入的年份(這很棘手;如何處理從19XX到20XX的分界線?)。
  3. 返回某個截止日期之前的任何日期的異常(可能由UI處理)(可能最好與某些客戶端驗證結合使用)
  4. 僅允許通過Web小部件(日期選擇器)輸入日期。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM