SimpleDateFormat - 日期无法解析

5

我尝试将字符串转换为日期。

这是我的代码:

    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”。

格式似乎没问题,我有漏掉什么吗?

谢谢。


谢谢,但仍然抛出相同的异常。 - Domiik
2
为什么这个问题被投票否决了?用户应该发布一个解释,说明如何改进这个问题,而不仅仅是点击向下箭头。 - darrengorman
2
请参考:https://dev59.com/8EfRa4cB1Zd3GeqP8FE6 - Brian Roach
这个问题对我来说似乎是合法的。你能提供更多关于这个问题发生在哪个Android平台上的信息吗?这是在“真实”的Android设备上发生的还是在模拟器中发生的? - Robert Heine
正如@BrianRoach在下面所述,这可能是一个Locale问题。您的设备运行在哪个Locale上? - Robert Heine
显示剩余2条评论
4个回答

8

你发布的代码要么不是你实际使用的代码,要么就是你遇到了区域设置问题。在使用美国区域设置下,Sun Oracle Java 1.6可以正常工作。

请将你的代码修改为:

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

1
嘿,看到我的编辑注释了吗?我实际上不得不回去改它...我永远不会习惯“Oracle Java”。 - Brian Roach
谢谢你,我的朋友。你的代码解决了一个问题,我花了数小时才能弄清楚。 - WitnessTruth

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

其他答案在2012年是好的答案。以下是一个使用现代(2014年)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);

这段代码示例是受到一个类似的问题的启发,如何在Java中将Xml字符串日期转换为整数。使用那个问题中的示例字符串,它会打印出:

date de la requete est Tue Feb 08 12:30:27 +0000 2011
new date 2011-02-08T12:30:27Z

问:我在Android上不能使用更新的类吗?

答:可以。对于Android,请使用专门针对Android定制的后备库ThreeTenABP。否则,对于Java 6和7,请使用ThreeTen Backport

问:你的代码不能用于这个问题中的日期时间字符串!

答:(1)如果可以,请避免使用CEST等三个和四个字母的时区缩写。许多缩写是模棱两可的,甚至可能随着JVM当前的时区设置而有所不同。CEST只是一个时区的夏季部分,而不是完整的时区。(2)如果您无法获得没有CEST或类似内容的字符串,请尝试使用ZonedDateTime代替OffsetDateTime,并在格式模式中使用zzz,就像问题中那样。这在示例中有效,并生成2012-04-08T16:37+02:00[Europe/Paris]

问:如何使用更新的类?

答:一个很好的开始地方是Oracle教程

问:Locale.ROOT

答:如果您的日期时间字符串来自世界上某个特定地点,并使用该地点的语言,请使用相应的语言环境。如果它只是因为计算机系统通常输出英语而以英语为主,我更喜欢使用“语言环境中性语言环境”Locale.ROOT,就像说“在这里不要做任何与语言环境相关的事情”。


-1

看起来 "Sun" 没有被识别。 请尝试:

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

对我来说可行。


1
根据 http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html ,使用缩写(比如Sun)或全拼(比如Sunday)都无所谓。 - Robert Heine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接