java - 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
解决方案
现在和现在的解决方案:
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.
一个点。还有许多其他差异。
链接
推荐阅读
- spring - 事务超时后错误的 atomikos 状态 ABORTING
- python - Python看门狗:忽略重复事件
- javascript - 在不同的函数中为函数设置变量
- c# - 使用 Or 的动态 Linq
- sql-server - 从共享点到 SQL Server 的 SSIS 数据加载在不同版本的 Visual Studio 中表现不同
- angular - 从 iframe 外部触发“显示数据”
- python - 在重复之前从文件中读取行并存储为变量以在另一个函数中使用
- javascript - 如何在读取第二个值之前禁用 NFC EventListener?
- javascript - 用于隐藏与输入不匹配的所有内容的 javascript 搜索功能
- apache - URL 上禁止 403 的问题