DateTimeFormatter 为边缘情况提供了错误的格式

DateTimeFormatter giving wrong format for edge cases

DateTimeFormatter 未按照以下代码段给出 2018 年 12 月 30 日和 31 日的正确格式。

final String DATE_FORMAT = "YYYYMM";
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern(DATE_FORMAT);
LocalDateTime startDate = LocalDateTime.of(2018,12,29,5,0,0);
System.out.println(startDate.format(dateFormat));
//prints 201812
LocalDateTime startDate = LocalDateTime.of(2018,12,30,5,0,0);
System.out.println(startDate.format(dateFormat));
//prints 201912 <------ should be 201812
LocalDateTime startDate = LocalDateTime.of(2018,12,31,5,0,0);
System.out.println(startDate.format(dateFormat));
//prints 201912 <------ should be 201812

这是预期的行为还是 DateTimeFormatter 存在错误?

这是预期的行为。 YYYY代表"week-based-year",与日历年不同(见JavaDoc

您很可能想使用 yyyy,这意味着 "year-of-era"

YYYY 是周年,yyyy 是年

所以更改 final String DATE_FORMAT = "YYYYMM"; ro final String DATE_FORMAT = "yyyyMM"; 应该会给你正确的结果。有关模式的更多信息,请参阅 javadoc of DateTimeFormatter.

2019 年的第一周从 2018 年 12 月 30 日开始。请参阅此link 了解有关凌晨的更多信息

y 用于 "year-of-era" 而 Y 用于 week-based-year

替换:

final String DATE_FORMAT = "YYYYMM";

至:

final String DATE_FORMAT = "yyyyMM";