将 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 DateTimeFormatterY基于周的 年。这意味着返回日期所在周的年份数。

事实上,2020 年 12 月 31 日实际上是 2021 年的第 1 周,因此返回的是 2021 年而不是 2020 年。

您可能想改用 yyyy