2016-02-13 114 views
2

我看起來類似的主題,但它並沒有幫助我。我有ISO-8601日期類型,例如:2014-08-13T19:05:22.168083+00:00
我嘗試分析它這樣:無法解析ISO-8601日期字符串到日期

public static Date parseISO8601(final String date) { 
    String fixedDate = date.replaceFirst("(\\d\\d[\\.,]\\d{3})\\d+", "$1"); 
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.ENGLISH); 

    try { 
     return df.parse(fixedDate); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

但它拋出異常。我不明白爲什麼?
錯誤消息:java.text.ParseException: Unparseable date: "2014-08-13T19:05:22.148+00:00"

+1

嘗試'X'的時區。 –

+0

謝謝!有用! –

+0

你知道它可以在Android API 9+上運行嗎? –

回答

2

使用X而不是Z時區,即:

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", ... 
+0

謝謝!我不知道'X'存在。 –

+0

對不起,我在舊設備(API 16)上檢查過它,它不起作用。舊的Android版本不知道'X'模式。 –

+1

阻止你使用'Z'的唯一部分是時區內的冒號。您可以使用另一個正則表達式去除冒號,例如: 'fixedDateTimezone.replaceAll(「(\\ d \\ d):(\\ d \\ d)$」,「$ 1 $ 2」)'。在這個操作之後,'Z'也適用於你。 _注意正則表達式結尾處的美元符號,它確保冒號不會在幾分鐘或幾秒內被移除,而是會在字符串末尾(即時區)移除._ –