DateTimeFormatter 得到 LocalDateTime.withYear(0) 的令人困惑的结果?

Guo*_*Guo 1 java datetimeformatter

Java版本:1.8.0_202
见下面的代码:

DateTimeFormatter yy = DateTimeFormatter.ofPattern("yy");
DateTimeFormatter yyy = new DateTimeFormatterBuilder()
                .appendValueReduced(ChronoField.YEAR, 3, 3, 0)
                .toFormatter();
DateTimeFormatter yyyy = DateTimeFormatter.ofPattern("yyyy");

LocalDateTime now = LocalDateTime.now();
// set year is 0
LocalDateTime year0 = now.withYear(0);
System.out.println("year0: " + year0);                             // year0: 0000-01-10T09:53:03.551
System.out.println("year0.getYear(): \t" + year0.getYear());       // year0.getYear():    0
System.out.println("year0.format(yyyy): " + year0.format(yyyy));   // year0.format(yyyy): 0001
System.out.println("year0.format(yyy): \t" + year0.format(yyy));   // year0.format(yyy):  000
System.out.println("year0.format(yy): \t" + year0.format(yy));     // year0.format(yy):   01
System.out.println("============================================================");
// set year is 1
LocalDateTime year1 = now.withYear(1);
System.out.println("year1: " + year1);                             // year1: 0001-01-10T09:53:03.551
System.out.println("year1.getYear(): \t" + year1.getYear());       // year1.getYear():     1
System.out.println("year1.format(yyyy): " + year1.format(yyyy));   // year1.format(yyyy):  0001
System.out.println("year1.format(yyy): \t" + year1.format(yyy));   // year1.format(yyy):   001
System.out.println("year1.format(yy): \t" + year1.format(yy));     // year1.format(yy):    01
Run Code Online (Sandbox Code Playgroud)

为什么year0.format(yyyy)andyear0.format(yy)返回错误的结果0001或者01,但year0.format(yyy)返回正确的结果000?怎么修?

Dan*_*etz 5

DateTimeFormatter 的文档说这y是“纪元年份”,这意味着永远不应该输出 0,因为没有纪元(AD 或 BC)的年份为 0。根据这些相同的文档,您正在寻找u而不是y如果您想要年份不显示纪元,即将公元前 1 年视为“0”年,将公元前 2 年视为“-1”年,等等。

相反,如果您想显示时代和年份,那就是Gie yyyy GG

由于当时和现在之间的日历变化,过去许多个世纪的日期可能会很复杂,因此请小心假设您可以将它们插入标准库并获得“正确”的结果。

“yyy”可能会给您不同的结果,因为“yyy”和“uuu”有特殊情况规则,如文档中所述。仅当您希望使用这些特定规则格式化输出时才使用它们。