【問題解決】使用YYYY-MM-dd時間轉換問題

FYHannnnnn發表於2020-12-31

測試邏輯:

  1. 建立兩個日期格式化,一個是出問題的YYYY-MM-dd,另一個是正確用法yyyy-MM-dd
  2. 分別去格式化兩個不同的日期:2020年12月26日(週六),2020年12月27日(週日)

具體程式碼如下:

public class Tests {

    @Test
    public void test() throws Exception {
        SimpleDateFormat df1 = new SimpleDateFormat("YYYY-MM-dd");
        SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");

        Calendar c = Calendar.getInstance();

        // 2020年12月26日週六
        c.set(Calendar.DATE, 26);
        System.out.println("YYYY-MM-dd = " + df1.format(c.getTime()));
        System.out.println("yyyy-MM-dd = " + df2.format(c.getTime()));

        // 分割線
        System.out.println("========================");

        // 2020年12月27日 週日
        c.add(Calendar.DATE, 1);
        System.out.println("YYYY-MM-dd = " + df1.format(c.getTime()));
        System.out.println("yyyy-MM-dd = " + df2.format(c.getTime()));
    }

}

跑一下測試,可以看到輸出結果如下:

YYYY-MM-dd = 2020-12-26
yyyy-MM-dd = 2020-12-26
========================
YYYY-MM-dd = 2021-12-27
yyyy-MM-dd = 2020-12-27
  • 2020年12月26日(週六),兩種格式化都正確
  • 2020年12月27日(週日),YYYY-MM-dd出了問題,年份到了2021年

問題原因

為什麼YYYY-MM-dd格式化2020年12月27日的時候,會到2021年呢?

因為YYYY是week-based-year,表示:當天所在的周屬於的年份,一週從週日開始,週六結束,只要本週跨年,那麼這周就算入下一年。

所以2020年12月27日那天在這種表述方式下就已經到 2021 年了。

而當使用yyyy的時候,就還是 2020 年。(國外聖誕節 12月25日以後為新一年)

相關文章