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

时间:2019-01-07 08:00:16

标签: java datetime java-8 datetime-format

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出现错误?

3 个答案:

答案 0 :(得分:9)

这是预期的行为。 YYYY代表“以周为基础的年份”,与日历年不同(请参阅JavaDoc

您最有可能想使用yyyy,意思是“时代”

答案 1 :(得分:5)

YYYY是周年,yyyy是年

因此,更改final String DATE_FORMAT = "YYYYMM"; ro final String DATE_FORMAT = "yyyyMM";应该会给您正确的结果。有关模式的更多信息,请参见javadoc of DateTimeFormatter

2019年的第一周从2018年12月30日开始。有关降雪年的更多信息,请参阅此link

答案 2 :(得分:2)

y代表“年龄”,而Y代表week-based-year

替换:

final String DATE_FORMAT = "YYYYMM";

收件人:

final String DATE_FORMAT = "yyyyMM";