【问题标题】:SimpleDateFormat - Unparseable dateSimpleDateFormat - 无法解析的日期
【发布时间】:2012-04-08 11:56:19
【问题描述】:

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

这是我的代码:

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

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

谢谢。

【问题讨论】:

  • 谢谢,但仍然抛出同样的异常。
  • 不,它没有。进行更改后尝试重新编译代码。 (除非您遇到一些奇怪的语言环境问题)
  • 为什么这个问题被否决了?用户应发布有关如何改进问题的说明,而不仅仅是单击向下箭头。
  • 这个问题对我来说似乎是合法的。您能否提供有关发生这种情况的 Android 平台的更多信息?你是在“真正的”安卓设备上还是在模拟器上发生的。

标签: java android simpledateformat


【解决方案1】:

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

将您的代码更改为:

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

【讨论】:

  • 嘿 - 请参阅我的编辑说明。我实际上不得不回去改变它......我永远不会习惯“Oracle Java”
  • 谢谢我的朋友。您的代码解决了我花了数小时试图解决的问题
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    其他答案是 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 上使用较新的类(?)

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

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

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

    问:如何使用较新的类?

    答:一个好的起点是Oracle Tutorial

    问:Locale.ROOT??

    答:如果您的日期时间字符串来自世界上的某个特定地点并使用该地点的语言,当然,请使用相应的语言环境。如果只是英文,因为各地的计算机系统都倾向于输出英文,我更喜欢使用 Locale.ROOT 表示“区域设置中性区域设置”,例如“不要在此处执行任何特定区域设置”。

    【讨论】:

      【解决方案4】:

      似乎无法识别“Sun”。 试试这个:

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

      为我工作。

      【讨论】:

      猜你喜欢
      • 2013-05-23
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多