【发布时间】:2017-12-12 12:52:18
【问题描述】:
我们的客户今天发现了一个有趣的错误。考虑以下方法:
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"))是完全不可能的,尤其是因为我们要解析默认值 日期格式。
【问题讨论】:
-
@vinS 这与我想要的完全相反。我想解析标准的德语日期。
-
我用 JDK-9 试过你的代码。它返回了类似的异常,但有三个细微差别: java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1988) java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1890) java.base/java.time.LocalDate.parse(LocalDate.java:428) 我认为你不能不检查你的字符串来解决这个问题。
-
不只有一个标准的德国日期。实际上,德国人使用多种形式,因此您不能完全依赖单一格式。
标签: java localization java-time