LocalDate 解析器无法将月份解析为字符串:'Aug'

LocalDate parser cannot parse month as a String: 'Aug'

我正在尝试使用 LocalDate 解析以下字符串:“2015 年 8 月 4 日”。

在尝试了一些 DateTimeFormatters 变体之后,我在 SO 中寻找答案,发现答案中给出的一些解析示例对我不起作用。经过进一步调查,我发现 java 14 无法解析包含字符串月份(例如“Jul”、“Feb”...)的日期,但在 java 8 和 10 中它可以完美运行。

抛出的异常是:

java.time.format.DateTimeParseException: Text '04 Aug 2015' could not be parsed at index 3

LocalDate/DateTimeFormatter 在 java 14 中是否有任何变化?我在文档中找不到任何内容。

这是在 java 8/10 成功打印并在 java 14 抛出 DateTimeParseException 的代码:

  public static void main(String[] args) {
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MMM yyyy");
    String anotherDate = "04 Aug 2015";
    LocalDate lds = LocalDate.parse(anotherDate, dtf);
    System.out.println(anotherDate + " , " + lds);
  }

把'Aug'变成'the 8th month'不是一件容易的事;大多数语言没有 'Aug'.

解析器将区域设置作为工作的一部分,并使用它来翻译(缩短)月份名称。

如果您不指定它,您将获得系统默认值,这可能会出现问题(因为它在您 运行 使用的每个 JVM 上可能不同)。

我猜你的 JDK14 安装使用的默认语言环境与其他安装不同。

测试如下:

System.out.println(java.util.Locale.getDefault());

并修复您的解析代码:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.ENGLISH);

注意:虽然在 java 代码和一百万个堆栈溢出示例中 非常 常见 DTF.ofPattern("pattern");,但其中 99% 的代码行代码 有问题 - 考虑到 java 通常部署在服务器上 and/or 此代码用于解析网络流量而不是本地类型的东西,让模式使用系统默认语言环境不正确。

就像你几乎不应该使用 new FileWriter("filename") 而应该使用 new FileWriter("filename", StandardCharsets.UTF_8); 一样,你几乎不应该使用 DateTimeFormatter.ofPattern(pattern); - 如果你的 IDE能够列出禁止的方法(调用必须附有说明您知道自己在做什么的注释的方法),您应该添加它。