開始之前,先看一個單元測試跑出的結果:
@Test
public void should_get_string_when_given_date() {
Long timeFor20191230 = 1577635200000L;
Date date = new Date(timeFor20191230);
String timeLower = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
String timeUpper = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(date);
System.out.println("yyyy-MM-dd HH:mm:ss" + " 對應 " + timeLower);
System.out.println("YYYY-MM-dd HH:mm:ss" + " 對應 " + timeUpper);
String timeForHourLower = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date);
System.out.println("YYYY-MM-dd hh:mm:ss" + " 對應 " + timeForHourLower);
}
第一個測試輸出結果如下:
yyyy-MM-dd HH:mm:ss 對應 2019-12-30 00:00:00
YYYY-MM-dd HH:mm:ss 對應 2020-12-30 00:00:00
YYYY-MM-dd hh:mm:ss 對應 2019-12-30 12:00:00
也就是說yyyy與YYYY輸出的年份不一致。
從上邊的結果看,發現同一個日期按 "yyyy-MM-dd HH:mm:ss” 與 "YYYY-MM-dd HH:mm:ss” 格式化後,得到的可能不一致。
原因:
YYYY 代表 Week Year
yyyy 代表year
再看下解析:
@Test
public void should_get_date_when_given_string() throws Exception {
Date timeLower = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-12-30 00:00:00");
Date timeUpper = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").parse("2019-12-30 00:00:00");
System.out.println("yyyy-MM-dd HH:mm:ss" + " 對應 " + timeLower.toString());
System.out.println("YYYY-MM-dd HH:mm:ss" + " 對應 " + timeUpper.toString());
Date timeForHourLower = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2019-12-30 00:00:00");
System.out.println("YYYY-MM-dd hh:mm:ss" + " 對應 " + timeForHourLower.toString());
}
此時解析的結果如下:
yyyy-MM-dd HH:mm:ss 對應 Mon Dec 30 00:00:00 CST 2019
YYYY-MM-dd HH:mm:ss 對應 Sun Dec 30 00:00:00 CST 2018
YYYY-MM-dd hh:mm:ss 對應 Mon Dec 30 00:00:00 CST 2019
這次更離譜
這裏補充一下,Oracle裏不區分大小寫,對應的 yyyy-MM-dd HH24:mi:ss代表24小時制,yyyy-MM-dd HH:mi:ss 代表12小時制。
HH代表24小時制
hh代表12小時制