2012-02-08 53 views
1

我不能使用喬達。當我嘗試創建代表UTC日期或日期時間字符串的日期或日曆,生成的對象具有與之相關聯的時區...TimeZone gost困擾我的日期時間解析

下面的代碼:

案例1:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyDDD"); 
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
Date date = sdf.parse("2012018"); 
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")); 
cal.setTime(date); 
System.out.println(cal.getTime()); //Tue Jan 17 19:00:00 EST 2012 !?!*&#&?? 

案例2:

SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmm"); 
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
Date date = sdf.parse("1202011431"); 
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")); 
cal.setTime(date); 
System.out.println(cal.getTime()); //Wed Feb 01 09:31:00 EST 2012 !?!*&#&?? 

回答

3

java.util.Date類型的對象是自Epoch以來的絕對時間量。當您從日曆創建日期對象時,它會丟失日曆可能使用的任何TimeZone,並且只會爲您提供原始時間量。 EST並不是真的與你的Date相關聯,只是Date上的toString方法使用JVM默認時區來創建一個可讀的表示。

重要的是要明白,在上面的代碼示例日曆的使用是做絕對沒有。只改變時區就會改變該日曆的人類可讀表示。在您撥打setTimegetTime之前和之後,曆元以來的原始毫秒數相同。

(與人類可讀表示有關的所有java.util.Date上的方法都被棄用且不能正常工作,最好簡單地假裝它們不存在。)

1

當你打印的時候,它總是印在你的機器上配置的本地時區,這是你想要的(存儲和表示日期/時間以UTC表示,並在演示期間轉換爲用戶特定的時區)。

1

是的,Java中的日期有一個與它們相關的時區。 Date上的toString在本地時區中打印日期。如果你不想要,使用DateFormat不顯示它。請注意,您需要將DateFormat上的時區設置爲UTC才能獲得您想要的內容。