我在运行一些代码时遇到了一个奇怪的错误.这是一个展示相同的简单版本.
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"))); } }
这返回了以下结果
2015-12-31 2015-11-30 2015-10-31 31/12/16 30/11/15 31/10/15
不知何故,2015年12月31日被转换为2016年12月31日.我写了一个for循环来做同样的不同年份,并发现多年来存在变化.12月26日以下的任何日期都不存在该错误.这是一个错误还是我错过了什么?
大写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