结论:日期时间类型转换一定要注意格式大小写,正确格式为:yyyy-MM-dd HH:mm:ss.如果写错可能会导致一些异常情况。
原因:
SimPleDateFormat底层是将时间存入一个calendar的公历子类实例(GregorianCalendar)中,因输入的年份字符串格式是YYYY,它对应的是数组下标是WeekYear的值,SimPleDateFormat中会判断下标值是否为CalendarBuilder.WEEK_YEAR的值,如果是则获取GregorianCalendar.getWeekYear()的值(该方法重写calendar.getWeekYear()根据WEEK_OF_YEAR去获取全年第几周,如果是第一周则年+1)。Calendar的内部机制,计算当头一年最后几天跟下一年的头几天为同一周时,则算下一年的第一周。而GregorianCalendar.getWeekYear()判断是第一周的时候则年份会加1。但其他周不夸年的,就会正常显示,所以这个问题不注意的话很难被测试出来。
代码示例:
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdff =new SimpleDateFormat("YYYY-MM-dd");
Date date = sdf.parse("2017-12-31 23:59:59");
String strsss = sdff.format(date);
System.out.println("异常转换"+strsss);
date = sdf.parse("2017-12-30 23:59:59");
strsss = sdf.format(date);
System.out.println("正常转换"+strsss);
输出结果: