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能够列出禁止的方法(调用必须附有说明您知道自己在做什么的注释的方法),您应该添加它。
我正在尝试使用 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能够列出禁止的方法(调用必须附有说明您知道自己在做什么的注释的方法),您应该添加它。