将 Java Instant 格式化为 "YYYYMMdd" 会增加一年?
Formatting Java Instant to "YYYYMMdd" adds an extra year?
这是漫长的一天,我的大脑很累,所以也许我完全错过了一些东西,但是当我 运行 这条线时,
为什么呢?
System.out.println(
DateTimeFormatter.ofPattern("YYYYMMdd")
.withZone(ZoneId.of("UTC"))
.format(Instant.parse("2020-12-31T08:00:00Z"))
)
)
我得到 20211231
而不是 20201231
?多出来的一年从哪里来?
你想要小写 y -
System.out.println(
DateTimeFormatter.ofPattern("yyyyMMdd")
.withZone(ZoneId.of("UTC"))
.format(Instant.parse("2020-12-31T08:00:00Z"))
);
根据 DateTimeFormatter. More about how it calculates over here 的官方文档,大写字母 Y
代表基于周的年份。
如果您使用小写 y
作为 yyyyMMdd
的日期格式化程序,这会很好地工作。
System.out.println(DateTimeFormatter.ofPattern("yyyyMMdd").withZone(ZoneId.of("UTC"))
.format(Instant.parse("2020-12-31T08:00:00Z")));
输出:
20201231
根据 the docs of DateTimeFormatter
,Y
是 基于周的 年。这意味着返回日期所在周的年份数。
事实上,2020 年 12 月 31 日实际上是 2021 年的第 1 周,因此返回的是 2021 年而不是 2020 年。
您可能想改用 yyyy
。
这是漫长的一天,我的大脑很累,所以也许我完全错过了一些东西,但是当我 运行 这条线时,
为什么呢?System.out.println(
DateTimeFormatter.ofPattern("YYYYMMdd")
.withZone(ZoneId.of("UTC"))
.format(Instant.parse("2020-12-31T08:00:00Z"))
)
)
我得到 20211231
而不是 20201231
?多出来的一年从哪里来?
你想要小写 y -
System.out.println(
DateTimeFormatter.ofPattern("yyyyMMdd")
.withZone(ZoneId.of("UTC"))
.format(Instant.parse("2020-12-31T08:00:00Z"))
);
根据 DateTimeFormatter. More about how it calculates over here 的官方文档,大写字母 Y
代表基于周的年份。
如果您使用小写 y
作为 yyyyMMdd
的日期格式化程序,这会很好地工作。
System.out.println(DateTimeFormatter.ofPattern("yyyyMMdd").withZone(ZoneId.of("UTC"))
.format(Instant.parse("2020-12-31T08:00:00Z")));
输出:
20201231
根据 the docs of DateTimeFormatter
,Y
是 基于周的 年。这意味着返回日期所在周的年份数。
事实上,2020 年 12 月 31 日实际上是 2021 年的第 1 周,因此返回的是 2021 年而不是 2020 年。
您可能想改用 yyyy
。