我正在尝试使用LocalDate解析以下字符串:“ 04 Aug 2015”。
在尝试了一些DateTimeFormatters的变体之后,我在SO中寻找答案,发现答案中给出的一些解析示例对我不起作用。经过进一步调查,我发现Java 14无法解析包含字符串月份的日期,例如“ Jul”,“ Feb” ...,但是在Java 8和10中,它可以正常工作。
引发的异常是:
java.time.format.DateTimeParseException:无法在索引3处解析文本“ 2015年8月4日”
Java 14中的LocalDate / DateTimeFormatter有什么变化吗?我在文档中找不到任何内容。
这是在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”。
解析器将语言环境作为工作的一部分,并使用它来翻译(缩短)月份名称。
如果不指定它,那么将获得系统默认值,这可能是有问题的(因为在其上运行的每个JVM上都可能不同)。
我的猜测是您的JDK14安装使用的默认语言环境与其他安装不同。
如下测试:
System.out.println(java.util.Locale.getDefault());
并修复您的解析代码:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.ENGLISH);
注意:虽然在Java代码和一百万个堆栈溢出示例中非常常见DTF.ofPattern("pattern");
,但是这些代码行中有 99%是错误的 -鉴于Java通常部署在服务器上和/或此代码用于解析网络流量和不是本地输入的内容,则使模式使用系统默认的语言环境是不正确的。
就像您几乎不应该使用,new FileWriter("filename")
而不是使用一样new FileWriter("filename", StandardCharsets.UTF_8);
,您也几乎不应该使用DateTimeFormatter.ofPattern(pattern);
-如果您的IDE能够列出禁止的方法(调用的方法必须带有注释,说明您知道您正在执行的操作),则应添加它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句