在开发中经常使用SimpleDateFormat来进行日期数据的格式化,这里年份项常见的有两种yyyy和YYYY,代码里也能看见混用的情况,通常情况下这两个值返回的结果是一个样的,(注意这里的时间是21号)
public static void main(String[] args) throws ParseException {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parse = format.parse("2020-12-21 22:22:22");
System.out.println(DateUtils.dateToString(parse,"yyyy-MM-dd HH:mm:ss"));
System.out.println(DateUtils.dateToString(parse,"YYYY-MM-dd HH:mm:ss"));
}
输出
2020-12-21 22:22:22
2020-12-21 22:22:22
然而,在涉及跨年的时间段时,却不是这样了,例如 注意这里的时间为27号
public static void main(String[] args) throws ParseException {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parse = format.parse("2020-12-27 22:22:22");
System.out.println(DateUtils.dateToString(parse,"yyyy-MM-dd HH:mm:ss"));
System.out.println(DateUtils.dateToString(parse,"YYYY-MM-dd HH:mm:ss"));
}
输出
2020-12-27 22:22:22
2021-12-27 22:22:22
之所以会出现错误是因为,在日期格式里,
小写的y才是我们通常想要的年份,大写的Y指的是week year
也即是说,当前周所包含的年份的较大值。
2019-12-29这天是星期天,在老外看来是一周的开始(即2020/12/27到2021/01/03算完整的一周),这个周里既包含2020年也包容2021年,因此在YYYY格式下,这周里的任意一天输出都是2021。
再回过头来看上面那个输出,当要格式化的日期time值为2012-12-27 00:00:00时,在YYYY-MM-dd HH:mm:ss格式下,MM-dd HH:mm:ss 对应的输出为12-27 00:00:00,这个是没问题的,而YYYY输出的不是2020,而是换成了2021,因此两个拼接到一起,就成了2021-12-29 00:00:00,引发了bug。