私はしばらくグーグルで検索しましたが、最も一般的に使用される方法は次のようです
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.prinln
s は、作成された日付を再確認するためのものです。次の出力が表示されます。
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
か?
一部の人が有益に指摘したように、このシフトの理由はこの質問で説明されています。ただし、この知識に基づいて正しい変換を推測する方法がわかりません。