據說又有兄弟由於用YYYY-MM-dd被錘了...

還記得去年分享過一篇日期格式化使用 YYYY-MM-dd 的潛在問題的文章不?java

歷史又重演了...單元測試

事故現場

咱們來寫個單元測試,重現一下這個問題。學習

測試邏輯:測試

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

具體代碼以下:spa

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()));
    }

}

跑一下測試,能夠看到輸出結果以下:code

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年
本文首發於獨立博客: http://blog.didispace.com/YYYY-MM-dd-2020-again/ ,更多技術乾貨歡迎收藏關注。

問題緣由

爲何YYYY-MM-dd格式化2020年12月27日的時候,會到2021年呢?orm

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

因此2020年12月27日那天在這種表述方式下就已經到 2021 年了。資源

而當使用yyyy的時候,就仍是 2020 年。get


最後,自查一下你的程序是否有這樣的問題吧!

歡迎關注個人公衆號:程序猿DD,得到獨家整理的免費學習資源助力你的Java學習之路!另每週贈書不停哦~
相關文章
相關標籤/搜索