日期时间解析异常

DateTimeParse Exception

在解析日期时,我的代码中经常出现异常错误。 日期看起来像这样:

Wed May 21 00:00:00 EDT 2008

这是尝试阅读它的代码:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy");
Property property = new Property();
property.setSale_date(LocalDateTime.parse(linesplit[8], formatter));

预期结果:LocalDateTime2008-05-21T00:00

我得到的是:

Exception in thread "main" java.time.format.DateTimeParseException: Text 'Wed May 21 00:00:00 EDT 2008' could not be parsed at index 0

我这样做完全错了吗?

细节决定成败。你基本上做对了,除了:

  • 您需要为格式化程序提供语言环境。
  • 通过解析为 LocalDateTime,您正在丢失信息并可能得到意想不到的结果。

所以我建议:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            "EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);

    String linesplit8 = "Wed May 21 00:00:00 EDT 2008";
    ZonedDateTime zdt = ZonedDateTime.parse(linesplit8, formatter);

    System.out.println(zdt);

输出为:

2008-05-21T00:00-04:00[America/New_York]

您的字符串是英文的。它看起来像 Date.toString() 的输出(Date 是 Java 8 之前使用的老式 class。所以它可能是英文的,因为 toString 方法总是产生英文输出。因此,如果您的语言环境不是英语语言环境,则解析将被视为失败,我相信这就是失败的原因。在这种情况下,将 Locale.ROOT 用于语言环境中性的英语语言环境是合适的。一种表达“不要在此处应用任何区域设置特定处理”的方式。

您的字符串包含时区缩写 EDT,这是标识唯一时间点的一部分,因此您也需要获取这部分信息。因此使用 ZonedDateTime.

链接

有一些related/similar问题,例如:

  • how to parse output of new Date().toString()
  • java DateTimeFormatterBuilder fails on testtime
  • How do I Date format for dd MMM yyyy, as in 01 Apr 2020 [duplicate]