2012-09-25 69 views
2

我試圖在解析我的代碼中的平面文件後,將平面文件中存在的字符串DateTime值轉換爲Date對象。錯誤格式化日期值

我已經寫了代碼來做這件事,但是當我格式化日期時,它總是給我一個日期超過1天的指定值,有時它會加上5點30分。

下面是該代碼:

DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy"); 
    Date date = f.parse("Tue Aug 23 20:00:03 PDT 2011"); 
    System.out.println("---date----" + date); 

的輸出上面是

---date----Wed Aug 24 08:30:03 IST 2011 

能否請你讓我知道什麼是這裏的問題。我在SimplaDateFormat類中使用的模式中存在問題,或者代碼存在問題。 現在我已經很長時間在這個問題上撓了撓頭。

+0

您是否嘗試過的時區設置爲你的DateFormat對象的問題?它有什麼時區? – ElderMael

+1

你對這裏的答案滿意嗎?請接受答案。 –

回答

3

您的系統時區不同。輸出結果顯示IST - 或印度標準時間,與PDT相差12.5h。該代碼正確解析給定的日期是PDT(UTC -7)並打印出IST(UTC + 5h30)。

Java將日期存儲爲UTC日期。因此,當您解析PDT日期時,Java會將其轉換爲UTC並將其內部存儲爲UTC時間戳。當你打印時,如果你不指定時區,它將默認爲系統時區,在你的情況下,它會顯示爲IST。

要指定一個確切的時區,在SimpleDateFormat的指定:

DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy"); 
f.setTimeZone(TimeZone.getTimeZone("PDT")); 
Date date = f.parse("Tue Aug 23 20:00:03 PDT 2011"); 
System.out.println("---date----" + f.format(date)); 
+0

嗨Eric.Thanks.I已經做出了上面顯示的更改,但它仍然不起作用,它仍然顯示與我原始問題相同的時間差異。 – vikeng21

+0

感謝Eric現在的工作 – vikeng21

+0

對不起...剪切和粘貼錯字。我對代碼片段做了一個小的編輯。 –

6

您能否讓我知道這裏的問題是什麼。

當然。你實際上呼叫date.toString(),它不知道什麼關於用於解析原始文本值的SimpleDateFormat。 A Date只需即時。它沒有每個實例格式的概念。另外,它不知道時區。你在PDT中給出了一個值,然後解析...當你使用系統本地時區(IST)print它。這就是Date.toString總是呢。

如果您想以特定方式格式化Date,請在特定時區使用特定格式,請撥打DateFormat.format

+0

感謝Jon.i糾正了我所犯的錯誤。我有一個新的日期格式DateFormat f2 = new SimpleDateFormat(「yyyy-MM-dd HH:mm:ss.SSS」);我想做這樣的事情Date dateParsed = f2.parse(originalDate);將舊日期轉換爲新格式。我得到一個java.text.ParseException:無法解析的日期:「8月23日星期二20:00:03 PDT 2011」。是否可以這樣做 – vikeng21

+0

@ vikeng21:那麼你的新格式沒有提及時區 - 它不符合你得到的文本值,所以是的,它將無法解析這種方式。您應該使用*現有*格式進行分析,然後使用* new *格式進行格式化。您應該考慮明確設置時區。 –

1

因爲你沒有格式化date。看一下例子

public static void main(String[] args){ 
    Locale currentLocale = Locale.US; 
    DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy", currentLocale); 
    Date date = null; 
    Date today; 
    try { 
     today = new Date(); 
     String result = f.format(today); 
     System.out.println("Locale: " + currentLocale.toString()); 
     System.out.println("Result: " + result); 
     date = f.parse("Tue Aug 23 20:00:03 PDT 2011"); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("---date----" + f.format(date)); 
    } 

將輸出

Locale: en_US 
Result: Tue Sep 25 19:12:38 EEST 2012 
---date----Tue Aug 23 20:00:03 PDT 2011 

現在,您有輸出到

Locale: en_US 
Result: Tue Sep 25 20:42:10 EEST 2012 
---date----Tue Aug 23 20:00:03 PDT 2011 
---date----Wed Aug 24 06:00:03 EEST 2011 

一點修改的代碼

public static void main(String[] args){ 
    Locale currentLocale = Locale.US; 
    DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy", currentLocale); 
    DateFormat f2 = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy", currentLocale); 
    Date date = null; 
    Date today; 
    try { 
     today = new Date(); 
     String result = f.format(today); 
     System.out.println("Locale: " + currentLocale.toString()); 
     System.out.println("Result: " + result); 
     date = f.parse("Tue Aug 23 20:00:03 PDT 2011"); 
     System.out.println("---date----" + f.format(date)); 
     System.out.println("---date----" + f2.format(date)); 

    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    } 

似乎SimpleDateFormat不要」不在乎蒂姆即使指定了'z'模式也是如此。它在分析輸入時設置時區。這就是我如何描述這種奇怪的行爲。然後使用'z'模式似乎已過時並導致不可預知的結果。

所以設置TimeZone將修復

f2.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); 
+0

嗨羅馬人。感謝我得到了我所犯的錯誤。只是後續我有一個新的日期格式DateFormat f2 =新的SimpleDateFormat(「yyyy-MM-dd HH:mm:ss.SSS」);我想做這樣的事情Date dateParsed = f2.parse(originalDate);將舊日期轉換爲新格式。我得到一個java.text.ParseException:無法解析的日期:「星期二8月23日20:00:03 PDT 2011」你能讓我知道我可以如何解決這個錯誤。 – vikeng21

+0

@ vikeng21在新的格式中,parsable日期看起來像「2011-08-23 20:00:03.000」 –

+0

然而,在新格式中,您沒有爲時區指定'z',並且在我的區域中它會顯示「2011-08 -24 06:00:03.000「 –