写在前面:
我是「境里婆娑」。我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年,还是最初那张脸,面前再多艰险不退却。
写博客的目的就是分享给大家一起学习交流,如果您对 Java感兴趣,可以关注我,我们一起学习
前言:上周日下午突然收到群里信息说让查下代码里是否有在使用YYYY-MM-dd来格式化时间。由于其他组项目有这样写导致文件审批不通过而产生了生产问题。
一、问题复现
写一个测试类来复现这个问题,创建两个格式化时间一个是正常的yyyy-MM-dd,另一个是YYYY-MM-dd。
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf1 = new SimpleDateFormat("YYYY-MM-dd");
Calendar instance = Calendar.getInstance(); //当前时间为2020-12-30
instance.add(Calendar.DATE,-4);
System.out.println("yyyy-MM-dd: " + sdf.format(instance.getTime()));
System.out.println("YYYY-MM-dd: " + sdf1.format(instance.getTime()));
System.out.println("=========我是分割线=========");
Calendar instance1 = Calendar.getInstance();
instance1.add(Calendar.DATE,-3); //当前时间为2020-12-30
System.out.println("yyyy-MM-dd = " + sdf.format(instance1.getTime()));
System.out.println("YYYY-MM-dd = " + sdf1.format(instance1.getTime()));
}
}
测试结果为:
yyyy-MM-dd: 2020-12-26
YYYY-MM-dd: 2020-12-26
=========我是分割线=========
yyyy-MM-dd = 2020-12-27
YYYY-MM-dd = 2021-12-27
- 2020年12月26日(周六),两个格式解析日期都正确。
- 2020年12月27日(周日),YYYY-MM-dd解析出现问题,年份显示为2021年
一、问题原因
带着疑问为什么YYYY-MM-dd格式化2020年12月27日时候,年份会变成2021年呢?
因为JDK6的SimpleDateFormat只有小y,没有大Y。JDK7开始引入了大Y,表示Week year。
Week year意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年
敲黑板:因此我们格式化时候一定要用yyyy-MM-dd这样的格式,才能避免我们程序出现跨年问题。