我试图用德国语言环境格式化一个date time对象,但是我得到了一个错误。
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
发布于 2018-05-09 18:01:43
此时此地解决方案:
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在注释中指出必须在命令行上设置该属性。有趣的是,相同的系统属性破坏了我的Java8上的代码。
更现代的解决方案:
String dateString = "Mi. Mai 09 09:17:24 2018";
我在字符串中的Mi
后面需要一个点(句点)来表示它是一个缩写。
区域设置提供程序
要在德语中解析日期,Java需要所谓的locale数据,包括德语和其他语言中使用的星期和月份的名称和缩写。更令人困惑的是,这些数据来自不止一个来源。在所有的Java 8、9和10中,Java包含至少两个来源的区域设置数据,Java自己的区域设置数据和来自CLDR的标准化区域设置数据,Unicode公共区域设置数据存储库(我不知道是否还有一个或两个更多的来源)。在Java8中,Java自己的数据是默认数据,如果需要这些数据,则需要指定CLDR。在Java 9和更高版本中,情况正好相反: CLDR是缺省的,但旧的Java数据以COMPAT的形式可用。这就解释了the comment by soon,您的代码在Java8上工作,但在Java10上失败。
显然,Java locale数据使用不带点的Mi
作为Mittwoch (星期三)的缩写,而CLDR使用带点的Mi.
。还有许多其他不同之处。
链接
https://stackoverflow.com/questions/50248220
复制相似问题