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

Ama*_*pta 6 java datetime datetime-format java-8

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
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*ger 9

这是预期的行为.YYYY代表"基于周的年份",与日历年不同(参见JavaDoc)

你很可能想要使用yyyy,这意味着"年代的时代"


Jen*_*ens 5

YYYY是一年,yyyy是一年

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

2019年的第一周从2018年12月30日开始.有关wee年的更多信息,请参阅此链接