gpt4 book ai didi

java - DateTimeFormatter 无法在德语中没有前导零的情况下解析日期

转载 作者:行者123 更新时间:2023-11-30 06:46:19 26 4
gpt4 key购买 nike

我们的客户今天发现了一个有趣的错误。考虑以下方法:

final DateTimeFormatter englishFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(Locale.ENGLISH);
System.out.println(LocalDate.parse("04/01/17", englishFormatter));
System.out.println(LocalDate.parse("4/1/17", englishFormatter));

final DateTimeFormatter germanFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(Locale.GERMAN);
System.out.println(LocalDate.parse("01.04.17", germanFormatter));
System.out.println(LocalDate.parse("1.4.17", germanFormatter));

(如果您不知道,这些确实是英语和德语的正确日期。我什至会说它们是同一日期 [2017 年 4 月 1 日]。花点时间考虑一下您对这个应用程序的看法应该返回。)

它返回的内容如下:

Exception in thread "main" java.time.format.DateTimeParseException: Text '1.4.17' could not be parsed at index 0
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.LocalDate.parse(LocalDate.java:400)
at Main.main(Main.java:20)

英文日期格式适用于带前导零和不带前导零的情况。德语格式仅适用于前导零。

我似乎无法找到一个属性来更改此行为以使其正常工作。

如何让 DateTimeFormatter 理解没有前导零的德语日期?

注意:我们的应用程序支持多个语言环境,因此使用特定的DateTimeFormatter(如DateTimeFormatter.ofPattern("d.M.yy"))是完全不可能,尤其是因为我们要解析默认 日期格式。

最佳答案

我尝试了相反的方法:使用本地化的格式化程序格式化日期。

    LocalDate testDate = LocalDate.of(2017, Month.APRIL, 1);

final DateTimeFormatter englishFormatter
= DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
.withLocale(Locale.ENGLISH);
System.out.println("English: " + testDate.format(englishFormatter));

final DateTimeFormatter germanFormatter
= DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
.withLocale(Locale.GERMAN);
System.out.println("German: " + testDate.format(germanFormatter));

我得到了

English: 4/1/17
German: 01.04.17

很明显,Java 认为标准的德语日期格式使用前导零。如果您确定这是错误的,您可以考虑向 Oracle 提交错误。

为了规避您不喜欢的行为,恐怕您需要使用多种语言设置。我能想到的最好的技巧如下。这不漂亮。它有效。

private static final Map<Locale, DateTimeFormatter> STEFFI_S_LOCALIZED_FORMATTERS
= createSteffiSFormatters();

private static Map<Locale, DateTimeFormatter> createSteffiSFormatters() {
Map<Locale, DateTimeFormatter> formatters = new HashMap<>(2);
formatters.put(Locale.GERMAN, DateTimeFormatter.ofPattern("d.M.uu"));
return formatters;
}

public static DateTimeFormatter getLocalizedFormatter(Locale formattingLocale) {
DateTimeFormatter localizedFormatter
= STEFFI_S_LOCALIZED_FORMATTERS.get(formattingLocale);
if (localizedFormatter == null) {
localizedFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
.withLocale(formattingLocale);
}
return localizedFormatter;
}

现在您可以:

    final DateTimeFormatter englishFormatter = getLocalizedFormatter(Locale.ENGLISH);
System.out.println(LocalDate.parse("04/01/17", englishFormatter));
System.out.println(LocalDate.parse("4/1/17", englishFormatter));

final DateTimeFormatter germanFormatter = getLocalizedFormatter(Locale.GERMAN);
System.out.println(LocalDate.parse("01.04.17", germanFormatter));
System.out.println(LocalDate.parse("1.4.17", germanFormatter));

这打印:

2017-04-01
2017-04-01
2017-04-01
2017-04-01

关于java - DateTimeFormatter 无法在德语中没有前导零的情况下解析日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47773148/

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