2017-08-11 74 views
-3

有關於SimpleDateFormat類一百萬線程在那裏,我有麻煩,太:的SimpleDateFormat不解析

這裏是我的小測試代碼

SimpleDateFormat dateReader = new SimpleDateFormat("EEE, dd LLL YYYY HH:mm:ss Z", Locale.ENGLISH); 
Calendar date = Calendar.getInstance(); 
try { 
    date.setTime(dateReader.parse(dateReader.format(date.getTime()))); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

有人可能會認爲,當前日期正確的格式將被正確解析,這將運行通過沒有麻煩,但相反,我得到一個例外java.text.ParseException: Unparseable date: "Fri, 11 Aug 2017 15:44:48 +0200"

最後,我只是想解析一個日期,如「星期四,2017年8月3日20:10:00 +0200」。我相信我有正確的模式。

我現在沒有線索,它有什麼問題。

EDIT
到另一問題是所使用的模式。如果您看到答案,則表明該模式已被錯誤使用,而其他大多數問題的模式完全錯誤或本地錯誤。在某處可能存在重複 - 但是在這些類似命名的問題中,將其作爲自己的問題可能會更快。

+1

試試'EEE,dd MMM yyyy HH:mm:ss Z' – Jesper

+0

'LLL'應該做什麼?不要在[docs](https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)中的選項中看到它 –

+0

@RobinTopper您指向JDK的文檔7;請參閱JDK 8的[文檔](http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html)。但它沒有很清楚地解釋... – Jesper

回答

2

我認爲你的問題是在年份格式中使用'yyyy'而不是'YYYY'。

SimpleDateFormat dateReader = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.ENGLISH); 
try { 
    dateReader.parse("Thu, 03 Aug 2017 20:10:00 +0200"); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 
+0

問題也是這個月,你在你的回答'MMM'中正確的,但他使用了'LLL'。順便說一句你的回答是正確的+1 – amicoderozer

+0

是的,的確,這是錯誤的月份格式。也許有人可以比Java文檔更好地說明何時使用'L'和何時'M'? – JSHelp

+1

@JSHelp如果您爲格式化程序(在構造函數SimpleDateFormat(String,DateFormatSymbols)或調用setDateFormatSymbols(DateFormatSymbols))中設置了DateFormatSymbols,則模式M將使用DateFormatSymbols中定義的月份名稱'對象,而'L'會忽略它並使用java內建的名字。如果你不設置'DateFormatSymbols','L'和'M'將產生相同的輸出。 – 2017-08-14 17:58:27