首页 > 解决方案 > java.time.format.DateTimeParseException:无法在索引 0 处解析文本“Mi Mai 09 09:17:24 2018”

问题描述

我正在尝试使用德语语言环境格式化日期时间对象,但出现错误。

String dateString = "Mi Mai 09 09:17:24 2018";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EE MMM dd HH:mm:ss yyyy", Locale.GERMAN);
LocalDateTime dateTime = LocalDateTime.parse(dateString, dtf);

错误:

java.time.format.DateTimeParseException: Text 'Mi Mai 09 09:17:24 2018' could not be parsed at index 0

标签: javadatetime-format

解决方案


现在和现在的解决方案:

System.setProperty("java.locale.providers", "COMPAT,CLDR");
String dateString = "Mi Mai 09 09:17:24 2018";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EE MMM dd HH:mm:ss yyyy", Locale.GERMAN);
LocalDateTime dateTime = LocalDateTime.parse(dateString, dtf);
System.out.println(dateTime);

输出(在 Java 9 和 Java 10 上测试):

2018-05-09T09:17:24

你的代码的唯一变化是我System.setProperty("java.locale.providers", "COMPAT,CLDR");在程序的开头插入了。根据文档,这不应该真的有效,但是当我尝试时它确实有效。相反,正确的方法是在运行 Java 程序时在命令行上提供相同的系统属性。例如:

java -Djava.locale.providers=COMPAT,CLDR com.ajax.ParseTwoLetterDayOfWeekAbbreviationInGerman

感谢Joep Weijers在评论中指出必须在命令行上设置该属性。有趣的是,同样的系统属性破坏了我的 Java 8 上的代码。

更现代的解决方案:

String dateString = "Mi. Mai 09 09:17:24 2018";

Mi在字符串后面需要一个点(句点)来表示它是一个缩写。

语言环境提供者

要解析德语中的日期,Java 需要所谓的语言环境数据,包括德语和其他语言中使用的星期几和月份的名称和缩写。令人困惑的是,这些数据来自不止一个来源。在所有 Java 8、9 和 10 中,Java 包含至少来自两个来源的语言环境数据,Java 自己的语言环境数据和来自 CLDR、Unicode 通用语言环境数据存储库的标准化语言环境数据(我不知道是否还有一两个来源) . 在 Java 8 中,Java 自己的数据是默认值,如果您想要这些数据,则需要指定 CLDR。在 Java 9 及更高版本中,情况正好相反:CLDR 是默认设置,但旧的 Java 数据可作为 COMPAT 使用。这很快解释了您的代码在 Java 8 上工作但在 Java 10 上失败的评论。

显然,Java 语言环境数据Mi没有点作为 Mittwoch(星期三)的缩写,而 CLDR 有Mi.一个点。还有许多其他差异。

链接


推荐阅读