DateTimeFormatter不能一直工作,bug?

mah*_*der 6 java datetime java-8 java-time

我在运行一些代码时遇到了一个奇怪的错误.这是一个展示相同的简单版本.

public class DateTest {

    public static void main(String[] args) {

        LocalDate decLast = LocalDate.of(2015, 12, 31);
        LocalDate novLast = LocalDate.of(2015, 11, 30);
        LocalDate octLast = LocalDate.of(2015, 10, 31);

        System.out.println(decLast+" "+novLast+" "+octLast);

        System.out.println(decLast.format(DateTimeFormatter.ofPattern("dd M YY"))+" "
                +novLast.format(DateTimeFormatter.ofPattern("dd M YY"))+" "
                +octLast.format(DateTimeFormatter.ofPattern("dd M YY")));


    }
}
Run Code Online (Sandbox Code Playgroud)

这返回了以下结果

2015-12-31 2015-11-30 2015-10-31
31/12/16 30/11/15 31/10/15
Run Code Online (Sandbox Code Playgroud)

不知何故,2015年12月31日被转换为2016年12月31日.我写了一个for循环来做同样的不同年份,并发现多年来存在变化.12月26日以下的任何日期都不存在该错误.这是一个错误还是我错过了什么?

Mar*_*vin 9

大写Y是" 基于周的年份 ",你正在寻找小写y.

来自链接的维基百科文章(由我强调):

ISO周编号年份(也称非正式ISO年份)有52或53周.那是364或371天而不是通常的365或366天.额外的一周在这里称为闰周,尽管ISO 8601不使用该术语.周从星期一开始.一年的第一周是包含一年中第一个星期四的一周(因此,总是包含1月4日).因此,ISO周年编号因接近1月1日的某些天而略微偏离格里高利.

[...]

例如,2014年12月29日是ISO 2015-W1-1,即2015年而不是2014年.

参看 还:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html