[英]Java - SimpleDateFormat unexpected parsing behaviour
我正在從文件(.csv)中讀取信息,該文件將在最終用戶驗證和批准后插入數據庫。 讀取,驗證文本文件並將其信息加載到包含表單的列表中,這些表單用於檢查數據庫中是否已存在數據。
將字符串解析為Date時出現問題。 即使SimpleDateFormat的模式為“ yyyy-MM-dd”,SimpleDateFormat.parse()方法也會返回意外的日期格式。
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
將加載的值解析為旅行對象:
travel.setDate( dateFormat.parse( form.getTravelDate() ));
在調試器中,表單將日期顯示為:
"2012-12-12"
按預期閱讀。 但是,解析后變成:
Wed Dec 12 00:00:00 CST 2012
我花了整整一天的時間來解決這個問題,但目前我還沒有想法。 Afaik的模式還可以,我嘗試添加區域設置無濟於事。
編輯:問題是當我需要使用Hibernate將值插入數據庫時。 不需要的格式也最終顯示在數據庫中。
數據顯示在.jsp頁面中,使用
HttpServletRequest("table",travelList);
我不需要的日期格式在這里顯示,過去從未發生過此問題。 最后,信息被發送到問題仍然存在的數據庫。
不,它“成為” java.util.Date
值。 如果隨后通過調用Date.toString()
將其轉換回字符串,則應查閱Date.toString()
文檔以了解期望的內容。
Date
存儲的值只是一個時間點-自Unix時代以來的毫秒數。 那里沒有格式,沒有時區等。它也不知道這只是一個日期值,而不是日期和時間( Date
的命名是API的許多不幸方面之一)。
至關重要的是,您必須在頭腦中將“解析操作的結果”與“如果我調用toString"
用來表示該結果的字符串值”分開。
我還建議您在解析日期時,將SimpleDateFormat
上的時區設置為SimpleDateFormat
這樣,您就知道您不可能有任何模棱兩可或跳過的時間,從而導致難以預測的行為。 (當然,然后,您需要知道將日期解析為“ UTC日期的開始”,並在其他位置進行適當處理。)
在打印Date
,也需要使用格式化程序。
dateFormat.format( travel.getDate() );
當使用DateFormat
解析String
,您將獲得一個完整的Date
對象,該字符串中缺少的時間單位被初始化為零。 在您的示例中,是小時,分鍾和秒。
默認情況下,如果不使用格式化程序,則將打印Date
的默認字符串表示形式(由其toString()
方法提供)。
解析並不意味着其格式,它只是將其解析為文本到java.util.Date
對象。 請參閱文檔中的parse方法 。
您需要使用format
方法。
dateFormat.format(travel.getDate())
有關更多詳細信息,請參見文檔 。
如果form.getTravelDate()
返回String,則首先從String Parse
日期
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
Date parsedDate=dateFormat.parse(form.getTravelDate());
// Here parsedDate is in form Wed Dec 12 00:00:00 CST 2012
現在使用相同的SImpleDateFormat格式化日期以獲取所需的輸出
System.out.println(dateFormat.format(parsedDate));
您想要的輸出
2012-12-12
更新
假設要在數據庫中插入此數據的列的數據類型是Date
類型,而不是varchar
則使用以下語句
travel.setDate(dateFormat.format(parsedDate));
據我了解, parse
方法返回Date
。 下面是解析方法的語法。
public Date parse(String source)
throws ParseException
因此,您需要解析字符串date並將其存儲到Date變量中。 然后使用SimpleDateFormat
格式化Date變量。
//getTravelDate is "2012-12-12"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
Date dtObj=new Date();
dtObj=dateFormat.parse(form.getTravelDate()); //Store in date variable
System.out.println(dateFormat.format(dtObj)); // Now format the date object
最終輸出將是2012-12-12
。 希望對您有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.