12

私はしばらくグーグルで検索しましたが、最も一般的に使用される方法は次のようです

date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

ただし、この方法は 1893 年 4 月 1 日より前の日付では失敗するようです。

次のテストは、私のマシンでは失敗し、結果は 1893-04-01 ではなく 1893-03-31 になります。

@Test
public void testBeforeApril1893() throws ParseException {
    Date date = new SimpleDateFormat("yyyy-MM-dd").parse("1893-04-01");

    System.out.println(date);

    LocalDate localDate2 = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

    System.out.println(localDate2);

    assertEquals(1893, localDate2.getYear());
    assertEquals(4, localDate2.getMonth().getValue());
    assertEquals(1, localDate2.getDayOfMonth());
}

System.out.prinlns は、作成された日付を再確認するためのものです。次の出力が表示されます。

Sun Apr 02 00:00:00 CET 1893
1893-04-02
Sat Apr 01 00:00:00 CET 1893
1893-03-31

1400-04-01 の場合、1400-04-09 という出力さえ得られます。

1893-04 より前の日付を正しく に変換する方法はありますLocalDateか?

一部の人が有益に指摘したように、このシフトの理由はこの質問で説明されています。ただし、この知識に基づいて正しい変換を推測する方法がわかりません。

4

3 に答える 3