2014-11-21 167 views
2

我正在Android上創建一個與服務器通信的應用程序。該服務器給我回了ISO 8601日期字符串,如下所示:如何在Android上解析ISO 8601字符串到Java日期

2014-11-21 12:24:56.662061-02

然後我試圖使用Java的SimpleDateFormatter解析我的字符串,像這樣:

 Locale l = new Locale("pt","BR"); 
     Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSZZ",l).parse(str_date); 
     Calendar cal = Calendar.getInstance(); 
     cal.setTimeInMillis(date.getTime()); 

事情是,此解決方案部分工作。我能夠正確地得到年,月,日和小時,但是當它達到幾小時,幾分鐘和幾秒時,我總是得到錯誤的分鐘。如果我嘗試使用我的示例String來打印它,我會得到類似於「12:35」而不是「12:24」的內容。我嘗試過不同的面具,使用Locale,而不是使用Locale,而且沒有任何東西可以用於我。

我已經看到了這個link該SimpleDateFormatter不支持ISO 8601的非常好,那傢伙給使用javax.xml.bind.DatatypeConverter.parseDateTime()方法的解決方案,但DatatypeConverter上不存在Android SDK。所以...我能做些什麼來正確解析這個字符串?

+1

您的示例中缺少'T',確實是ISO 8601 ...但是您的格式似乎可以處理此問題。 SimpleDateFormat的例子只使用一個'Z'字符,也許這就是問題所在?此外,你有太多的'...'從來沒有超過3位數,所以'SSS'應該做的。 – haraldK 2014-11-21 15:24:11

+0

那麼,我已經嘗試了很多不同的面具,而使用三重S的面具會引發異常。我也嘗試使用一個Z,它不起作用。 – Mauker 2014-11-21 23:07:57

回答

4

S是毫秒; 662061是662 s = 11分鐘。

以某種方式扔掉微秒,並使用SSS。

str_date = str_date.replaceFirst("(\\d\\d[\\.,]\\d{3})\\d+", "$1"); 
+0

我會盡力的!謝謝! – Mauker 2014-11-21 23:08:22

+0

它的工作!我已經使用你的代碼,並將面具改爲「SSSZ」,它的工作!非常感謝你! – Mauker 2014-11-21 23:45:08

相關問題