2016-02-13 116 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'也适用于你。 _注意正则表达式结尾处的美元符号,它确保冒号不会在几分钟或几秒内被移除,而是会在字符串末尾(即时区)移除._ –