开始之前,先看一个单元测试跑出的结果:
@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小时制