Java中慎用yyyy與YYYY

開始之前,先看一個單元測試跑出的結果:

    @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小時制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章