如何在 java 中解析 ~german 自定义格式日期?[复制]

How can I parse ~german custom formatted dates in java? [duplicate]

提问人:MS13 提问时间:10/25/2023 最后编辑:MS13 更新时间:10/25/2023 访问量:53

问:

我想以这样的格式解析我收到的日期,但使用德国月份:LocalDate

  • 8月 15, 2023
  • 30-Mai-2024
  • 13-九月-2021
  • 31-MRZ-2034
  • 2013 年 2 月 2 日

我简化了应该解析这些格式化日期的代码(月份是德语),但它仍然不适用于 jdk 11.0.7 和 openjdk 11.0.13

    public static void main(String args[]) {
        String txt = "15-Aug-2023";
        DateTimeFormatter format =  new DateTimeFormatterBuilder()
                .appendPattern("dd-MMM-yyyy")
                .toFormatter(Locale.GERMAN);
        LocalDate.parse(txt, format);
    }

抛出异常:

线程“main”java.time.format.DateTimeParseException中的异常: 无法在索引 3 中解析文本“15-Aug-2023”

我错过了什么?

PS 刚刚注意到,如果我这样做:

System.out.println(format.format(LocalDate.now()));

我得到:

2023 年 9 月 24 日

我怎样才能克服这个意想不到的点?

日期时间 java-time

评论

0赞 knittl 10/25/2023
“2023 年 8 月 15 日”是德语和英语的同一天(8 月是 8 月)。
0赞 MS13 10/25/2023
是的,我知道这就是我选择它的原因,但仍然不起作用:)
1赞 knittl 10/25/2023
stackoverflow.com/questions/69860992/......这个问题是关于格式的,但我想解决方案也适用于解析。TLDR:需要点;您必须使用自定义区域设置或覆盖月份缩写。Locale.GERMAN
0赞 knittl 10/25/2023
“Mrz”是一个非标准的缩写。月份“März”的标准缩写是“Mär”。
1赞 Basil Bourque 10/25/2023
建议:请告知数据发布者,请仅使用 ISO 8601 标准格式(而不是本地化文本)将日期时间值交换为文本。

答:

2赞 PeterMmm 10/25/2023 #1

这对我来说是:

public class Main {
    public static void main(String[] args)  {
        String txt = "15-Aug-2023";
        DateTimeFormatter format =  new DateTimeFormatterBuilder()
                .appendPattern("dd-LLL-yyyy")
                .toFormatter(Locale.GERMAN);
        System.out.println(LocalDate.parse(txt, format));
    }
}

打印: 2023-08-15

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

评论

1赞 knittl 10/25/2023
JavaDoc 可以在此基础上进行改进。目前还不清楚 M 做什么和 L 做什么(以及为什么一个点而另一个不点)
0赞 PeterMmm 10/25/2023
System.out.println(format.format(LocalDate.now()));打印在这里。好的,有 openjdk 版本“21” 2023-09-1924-Okt-2023
0赞 knittl 10/25/2023
是的,我明白了。官方的 JavaDoc 仍然需要改进。这个答案很好。
0赞 MS13 10/25/2023
仍然不适用于 31-Mrz-2034 相同的错误。我不知道他们是如何发送这些日期???
1赞 knittl 10/25/2023
@MS13因为“Mrz”不是“正确”(官方?)的缩写。它是“Mär”。如果使用非标准缩写,则必须使用自定义区域设置(或自定义月份映射;请参阅问题下的链接问答)