2017-08-11 75 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