2016-02-07 29 views
3

我正試圖解析美國/阿留申時間戳。這在過去有效,我無法找出爲什麼它不再有效。我正在運行的Java 1.8更新72Java 1.8拒絕使用US/Aleutian(HAST)時區解析日期嗎?

的代碼如下:

try { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"); 
     sdf.setTimeZone(TimeZone.getTimeZone("US/Aleutian")); 

     // the following line throws an parsing exception 
     Date d = sdf.parse("1969-12-31T13:00:00HAST"); 
     System.out.println(sdf.format(d)); 

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

...的Date d = sdf.parse("1969-12-31T13:00:00HAST");行拋出一個異常,但我無法找出什麼地方錯了:

java.text.ParseException: Unparseable date: "1969-12-31T13:00:00HAST" 
    at java.text.DateFormat.parse(Unknown Source) 

我確信這在過去有效。我研究了HAST時區,它是有效的。我不知道爲什麼這不適合我。

任何人都可以找出發生了什麼?如果這對你有用,你可以請列出你的Java版本,以便我們可以找出是否/何時破壞了?

謝謝!

+1

'TimeZone.getTimeZone(「HAST」)'現在返回GMT,根據[文檔](https://docs.oracle.com/javase/8/docs/api/java/util/TimeZone.html #getTimeZone-java.lang.String-)表示請求的TimeZone ID未被理解。我不知道爲什麼HAST不再被接受。 – VGR

+0

哇!這很奇怪......我不確定,這看起來像Java本身的錯誤。但是一個奇怪的。爲什麼這會被刪除? o.O –

+1

我建議儘可能使用id代替同義詞:「America/Adak」(而不是「US/Aleutian」)。 –

回答

4

找到了答案。

「夏威夷 - 阿留申標準和日光倍的縮寫已經從HAST/HADT改爲HST/HDT,按照美國政府印刷:

this,在Java 6的更新101刪除的縮寫辦公室風格,自1983年以來,這隻影響美國/阿達克,因爲美國/檀香山已經在使用新風格。「

所以我會繼續使用HST代替。

感謝大家的輸入!

-1

SimpleDateFormat是一箇舊類,它有一些問題。嘗試使用Java 8中新類的類java.time.format.DateTimeFormatter。嘗試如下所示:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssz"); 
    Instant instant = formatter.parse("1969-12-31T13:00:00HAST", Instant::from); 
    Date date = Date.from(instant); 
+0

問題是我將SimpleDateFormat傳遞給Jackson,JSON庫。它在內部使用SimpleDateFormat。我或許可以嘗試找到一種方法讓傑克遜使用別的東西來解析,但是我的使用案例很複雜,這意味着要對傑克遜進行心臟直視手術。如果我能夠發現SimpleDateFormat發生了什麼,並且在這裏解析正確,那會更好。 –

+0

實際上,對於JSON,您應該將日期格式設置爲字符串,並只提供JSON字符串。意思是把你的日期格式轉換成你想要的格式的字符串,並把它提供給你的JSON –

+0

這是一個字符串。輸入內容類似於「{」date「:」1969-12-31T14:00:00HAST「}'。我使用傑克遜來解析這個問題,傑克遜需要一所老式的'DateFormat'來定製被解析的JSON中的日期格式。因此我需要讓SimpleDateFormat處理這個時區。 –