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

格式好像没问题。我错过了什么吗?

谢谢。

4

4 回答 4

8

您发布的代码不是您的实际代码,或者您有语言环境问题。它在具有美国语言环境的Sun Oracle Java 1.6 上运行良好。

将您的代码更改为:

SimpleDateFormat format =  
    new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
于 2012-04-08T12:21:44.720 回答
5

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

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

或使用不特定于区域设置的格式。

于 2012-04-08T13:53:56.657 回答
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);

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

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

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

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

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

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

问:如何使用较新的类?

答: Oracle 教程是一个很好的起点。

问:Locale.ROOT??

答:如果您的日期时间字符串来自世界上的特定地点并使用该地点的语言,当然请使用相应的语言环境。如果它只是英语,因为各地的计算机系统都倾向于输出英语,我更喜欢使用Locale.ROOT“语言环境中性语言环境”,比如说“不要在这里做任何特定于语言环境的事情”。

于 2017-06-04T09:47:34.080 回答
-1

看起来“太阳”无法识别。尝试这个:

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

为我工作。

于 2012-04-08T12:14:15.930 回答