2013-07-04 51 views
1

我對SimpleDateFormat有一個奇怪的問題,問題在於日期格式化程序不會將日期解析到我的TimeZone中,即使TimeZone.getDefault()爲我提供了正確的TimeZone。Java SimpleDateFormat不能正常工作

如果這還不夠,我運行以下命令,我得到了以下結果(評論):

SimpleDateFormat df = new SimpleDateFormat("MM/dd/yy HH:mm a"); 

Date now = new Date();   
System.out.println(now);       // Wed Jul 03 18:58:37 CDT 2013 
System.out.println(df.format(now));     // 07/03/13 18:58 PM (ok) 
System.out.println(df.parse("07/03/13 18:58 PM")); // Wed Jul 03 00:58:00 CDT 2013 (not ok) 
System.out.println(df.parse(df.format(now)));  // Wed Jul 03 00:58:00 CDT 2013 

這怎麼可能?我甚至不知道df.parse方法在做什麼,因爲所產生的小時數從來沒有超過1點,我的意思是18點5​​8分,但現在我的時間是7點32分,我仍然得到00:32而不是1:32。

我錯過了什麼嗎?字符串日期從服務器獲得,並且它們的格式不能被更改,因爲它們已用於其他已有的生產性服務。

這發生在Android手機中,手機中的時間已設置好。

+0

嗯...那些都不是結果,那些評論!認真。如果你運行System.out.println(df.format(df.parse(「07/03/13 18:34 PM」))),你會得到什麼? –

+1

你知道當你使用'SimpleDateFormat#parse'時,你會得到'Date'並且'Date'對象本身沒有模式,對嗎? –

+0

@ G.BlakeMeike這是爲了節省空間的問題,這些是打印,我會編輯我的問題,包括系統... – htafoya

回答

2

好,我知道了,在「沒有過去的1點是關鍵」

的問題是,解析文本「H」在0-23小時內使用,用於AM-PM你應該使用「H」「K」

最終的格式字符串必須是:

"MM/dd/yy hh:mm a" 

我認爲Java應該發送錯誤或警告試圖解析過去> 12小時,而不是用「00」代替。

+0

對於你解析的字符串,H很好。這很奇怪,但很好。使用你的格式字符串和你的日期字符串它適合我解析。如果我使用HH而不是HH,它會增加12個小時的時間,並說07/04/13 06:34 AM Thu Jul 04 06:34:00 PDT 2013 – majinnaibu

+0

我不明白的是爲什麼'07/03/13 18:34 PM'被解析爲'Wed Jul 03 00:58:00 CDT 2013'。即使我們認爲「H」是爲什麼要增加24分鐘的問題。 – JHS

+0

你確定這是你使用的格式字符串嗎?如果你將它改回「MM/dd/yh H:mm a」,你還會得到錯誤的日期嗎?您應該使用適合您的數據的任何一種。我只是好奇它爲什麼發生。 – majinnaibu