【問題解決】YYY-MM-ddを用いた時間変換問題


テストロジック:
  • は、問題のあるYYYY-MM-ddと正しい使い方yyyy-MM-dd
  • の2つの日付フォーマットを作成します.
  • はそれぞれ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日以降は新年度)