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

问题描述 投票:0回答:1

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

为什么

year0.format(yyyy)
year0.format(yy)
返回错误结果
0001
01
,而
year0.format(yyy)
返回正确结果
000
?如何修复?

java datetimeformatter
1个回答
0
投票

不知道为什么“yyy”会给你一个不一致的结果,但是DateTimeFormatter的文档说

y
代表“纪元年份”,这意味着永远不应该给出0,因为没有纪元(AD或BC)有年份0. 根据这些相同的文档,如果您希望显示没有纪元的年份,则需要查找
u
而不是
y

如果要同时显示纪元和年份,那就是

G
,即
yyyy GG

© www.soinside.com 2019 - 2024. All rights reserved.