DateTimeFormatter 在格式化后添加一个日期

DateTimeFormatter adding a year to date after formatting

我正在尝试将 2019-12-30 格式的日期转换为 30-12-2019 格式的日期,为此我考虑使用 DateTimeFormatter 并且我有以下代码:

LocalDate date = LocalDate.parse("2019-12-30");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-YYYY");
System.out.println(formatter.format(date));

然而,令我惊讶的是,这个 returns 输出:

30-12-2020

而不是预期的 30-12-2019。如果日期设置为 2019-11-30,则它正确 returns 30-11-2019。我正在做一些非常错误的事情,但我无法弄清楚到底是什么。有人可以帮忙吗?

使用"dd-MM-yyyy"代替"dd-MM-YYYY" 尝试以下代码片段以获得预期结果 -

LocalDate date = LocalDate.parse("2019-12-30");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
System.out.println("date " + formatter.format(date)); // date 30-12-2019

出自DateTimeFormatter documentation:,说明符号、含义及例子:

Y week-based-year year 1996; 96

所以你格式化的是基于周的年份,而不是常规年份。 2019 年 12 月 30 日属于 2020 年的第一周,因此您的输出。

使用 yyyy(年代)或 uuuu(年份)代替 YYYY,您将得到 2019。

基本上,YYYY 通常应与 w(基于年份的星期几)和 E(星期几)一起使用。

您正在使用 DateTimeFormatter.ofPattern("dd-MM-YYYY");,请注意 Y 代表 week-based-year,您可能不需要。也许你希望你的模式是 "dd-MM-uuuu"。有关模式的更多信息,请参阅 Oracle 官方文档:Patterns for Formatting and Parsing