解析工作日不适用于语言环境德语
Parsing of weekdays not working for locale german
我正在尝试使用 java.time.format.DateTimeFormatter 来解析时间字符串,但 运行 在解析德语短星期几名称时出现问题。
给定以下程序
import java.time.DayOfWeek;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.TextStyle;
import java.util.Locale;
var locale = Locale.forLanguageTag("de");
var dtf = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern("eeee"))
.appendOptional(DateTimeFormatter.ofPattern("eee"))
.toFormatter(locale);
var input1 = DayOfWeek.TUESDAY.getDisplayName(TextStyle.FULL, locale);
var input2 = DayOfWeek.TUESDAY.getDisplayName(TextStyle.SHORT_STANDALONE, locale);
System.out.printf("input: %s, parsed: %s\n", input1, dtf.parse(input1));
System.out.printf("input: %s, parsed: %s\n", input2, dtf.parse(input2));
我期望的输出是
input: Dienstag, parsed: {DayOfWeek=2},ISO
input: Di, parsed: {DayOfWeek=2},ISO
但我实际上得到了
input: Dienstag, parsed: {DayOfWeek=2},ISO
Exception in thread "main" java.time.format.DateTimeParseException: Text 'Di' could not be parsed, unparsed text found at index 0
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1874)
at org.rksm.Main.main(Main.java:22)
请注意,当我将区域设置更改为 Locale.forLanguageTag("en")
时,它可以正常工作并且输出为
input: Tuesday, parsed: {DayOfWeek=2},ISO
input: Tue, parsed: {DayOfWeek=2},ISO
我做错了什么?
尽管在英语中单独使用日期名称与在日期上下文中使用的名称没有区别,但在德语中显然是有区别的。
模式 eee
对应于 TextStyle.SHORT
,而模式 ccc
对应于 TextStyle.SHORT_STANDALONE
。因此,如果您尝试在重要的语言中解析由 TextStyle.SHORT_STANDALONE
和 eee
创建的日期名称,解析将失败。
独立版本的方法是ccc
。
提到这个的文档实际上是在 DateTimeFormatterBuilder
API 而不是 DateTimeFormatter
的。
我正在尝试使用 java.time.format.DateTimeFormatter 来解析时间字符串,但 运行 在解析德语短星期几名称时出现问题。
给定以下程序
import java.time.DayOfWeek;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.TextStyle;
import java.util.Locale;
var locale = Locale.forLanguageTag("de");
var dtf = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern("eeee"))
.appendOptional(DateTimeFormatter.ofPattern("eee"))
.toFormatter(locale);
var input1 = DayOfWeek.TUESDAY.getDisplayName(TextStyle.FULL, locale);
var input2 = DayOfWeek.TUESDAY.getDisplayName(TextStyle.SHORT_STANDALONE, locale);
System.out.printf("input: %s, parsed: %s\n", input1, dtf.parse(input1));
System.out.printf("input: %s, parsed: %s\n", input2, dtf.parse(input2));
我期望的输出是
input: Dienstag, parsed: {DayOfWeek=2},ISO
input: Di, parsed: {DayOfWeek=2},ISO
但我实际上得到了
input: Dienstag, parsed: {DayOfWeek=2},ISO
Exception in thread "main" java.time.format.DateTimeParseException: Text 'Di' could not be parsed, unparsed text found at index 0
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1874)
at org.rksm.Main.main(Main.java:22)
请注意,当我将区域设置更改为 Locale.forLanguageTag("en")
时,它可以正常工作并且输出为
input: Tuesday, parsed: {DayOfWeek=2},ISO
input: Tue, parsed: {DayOfWeek=2},ISO
我做错了什么?
尽管在英语中单独使用日期名称与在日期上下文中使用的名称没有区别,但在德语中显然是有区别的。
模式 eee
对应于 TextStyle.SHORT
,而模式 ccc
对应于 TextStyle.SHORT_STANDALONE
。因此,如果您尝试在重要的语言中解析由 TextStyle.SHORT_STANDALONE
和 eee
创建的日期名称,解析将失败。
独立版本的方法是ccc
。
提到这个的文档实际上是在 DateTimeFormatterBuilder
API 而不是 DateTimeFormatter
的。