簡體   English   中英

Java-SimpleDateFormat意外的解析行為

[英]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.

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