emo*_*ssi 3 java datetime-format
我正在尝试使用德语区域设置格式化日期时间对象但是我收到了错误.
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);
Run Code Online (Sandbox Code Playgroud)
错误:
java.time.format.DateTimeParseException: Text 'Mi Mai 09 09:17:24 2018' could not be parsed at index 0
Run Code Online (Sandbox Code Playgroud)
解决方案现在和现在:
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);
Run Code Online (Sandbox Code Playgroud)
输出(在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
Run Code Online (Sandbox Code Playgroud)
感谢Joep Weijers在评论中指出必须在命令行上设置属性.有趣的是,同样的系统属性破坏了我的Java 8上的代码.
更现代的解决方案
String dateString = "Mi. Mai 09 09:17:24 2018";
Run Code Online (Sandbox Code Playgroud)
我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没有dot作为Mittwoch(星期三)的缩写,而CLDR有Mi.一个点.还有许多其他差异.
链接
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |