情况
Date date=new Date("12/31/2021");
SimpleDateFormat s=new SimpleDateFormat("YYYY-MM-dd");
System.out.println(s.format(date));
"YYYY-MM-dd"
这段格式化代码输出结果是
2022-12-31
SimpleDateFormat 的格式换成 "yyyy-MM-dd"
则输出正确
2021-12-31
原因
StackOverflow 一个帖子说的很直白
@“YYYY” is week-based calendar year.
@“yyyy” is ordinary calendar year.
YYYY 是基于周的日历,也就是说如果当前周跨年,YYYY会把年份设为跨年后的年份,呈现的效果就是 年份+1
上面的例子中 2021年12月31号是周五,31号所在的这一周跨年了,所以最后输出是 2022
,
如果是 2017年12月31号(这一天是周日) 用YYYY格式化 ,输出则是正常的 2017-12-31
yyyy就是我们平常理解的日历,所以平时对年的格式无脑用yyyy就行了
至于为什么YYYY是基于周,得去看 ISO 8601 这个标准了~