SimpleDateFormat - 无法解析的日期

时间:2012-04-08 11:56:20

标签: java android simpledateformat

我尝试将String转换为Date。

这是我的代码:

    SimpleDateFormat format =  new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    Date date = format.parse("Sun Apr 08 16:37:00 CEST 2012");

我得到例外:

  

04-08 13:51:36.536:W / System.err(8005):java.text.ParseException:   无法解释的日期:“Sun Apr 08 16:37:00 CEST 2012”。

格式似乎没问题。我错过了什么吗?

感谢。

4 个答案:

答案 0 :(得分:7)

您发布的代码不是您的实际代码,或者您遇到了区域设置问题。它适用于带有美国语言环境的 Sun Oracle Java 1.6。

将您的代码更改为:

SimpleDateFormat format =  
    new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);

答案 1 :(得分:5)

SimpleDateFormat具体为Locale。至少模式EM是特定于语言环境的,因为例如“Sun”或“Sunday”与Locale.GERMAN或Locale.FRENCH等不匹配。您最好指定使用的Locale

SimpleDateFormat format =  new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);

或使用非特定于语言环境的格式。

答案 2 :(得分:2)

其他答案在2012年都是很好的答案。以下是如何处理现代(2014)Java日期和时间类的示例:

CJ(vars, vis, sorted = FALSE)[, paste(vars, vis, sep =".")]

代码示例的灵感来自一个重复的问题(我认为),How to convert Xml String date to int in java。使用该问题的示例字符串打印:

    System.out.println("date de la requete est " + dateq);
    DateTimeFormatter dtf = DateTimeFormatter
            .ofPattern("EEE MMM dd HH:mm:ss xx uuuu", Locale.ROOT);
    OffsetDateTime dateTime1 = OffsetDateTime.parse(dateq, dtf);

    System.out.println("new date " + dateTime1);

问:我无法在Android上使用较新的课程(?)

答:是的,你可以。对于Android,请使用专为Android定制的后端,ThreeTenABP。否则,对于Java 6和7,请使用ThreeTen Backport

问:您的代码不适用于问题中的日期时间字符串!

答:(1)如果可以,请避免使用像CEST这样的三个和四个字母的时区缩写。许多都是模棱两可的,解释甚至可能因您的JVM当前时区设置而异。 CEST只是时区的夏半,而不是全时区。 (2)如果您无法获得没有date de la requete est Tue Feb 08 12:30:27 +0000 2011 new date 2011-02-08T12:30:27Z 或类似字符串的字符串,请尝试使用CEST代替ZonedDateTime,并使用格式模式中的OffsetDateTime。这适用于示例并生成zzz

问:我如何使用较新的课程?

答:一个好的起点是Oracle Tutorial

问:2012-04-08T16:37+02:00[Europe/Paris] ??

答:如果您的日期时间字符串来自世界上的特定地点以及该地点的语言,请使用相应的区域设置。如果只是英文版,因为世界各地的计算机系统都倾向于输出英文,我更喜欢使用Locale.ROOT作为“区域性中性区域设置”,就像说“不要在这里做任何特定于区域设置的事情”。

答案 3 :(得分:-1)

看起来像#34; Sun"没有得到认可。 试试这个:

date = format.parse("Sunday Apr 08 16:37:00 CEST 2012");

适合我。