結論:日期時間類型轉換一定要注意格式大小寫,正確格式為: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);
輸出結果: