gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:47:30 27 4
gpt4 key购买 nike

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

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 Common Locale Data Repository的标准化语言环境数据(不知道还有一两个来源) .在 Java 8 中,Java 自己的数据是默认值,如果您需要这些数据,则需要指定 CLDR。在 Java 9 及更高版本中,情况正好相反:CLDR 是默认值,但旧的 Java 数据可用作 COMPAT。这解释了 the comment by soon您的代码在 Java 8 上运行,但在 Java 10 上运行失败。

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

链接

关于java.time.format.DateTimeParseException : Text 'Mi Mai 09 09:17:24 2018' could not be parsed at index 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50248220/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com