DateFormatter для отображения правильной правильной исторической даты, как это фактически произошло в истории. Распечатка времени ISO для исторических периодов может показаться бессмысленной или неточной, но сохранение времени в этом формате все еще допустимо.

я есть устаревший код, который использует java.util.Date для создания древней даты (30 ноября 0002). Я пытаюсь обновить то, что код, который я могу, но это требует преобразования между Date и LocalDate и т. Д. Я не могу полностью избавиться от использования Date или выбора древней даты.

Я нахожу, что кажется ошибкой при переходе назад и вперед между датой и мгновением с этой древней датой, и надеялся, что кто-нибудь сможет объяснить, что происходит.

Вот пример:

    Date date = new Date();
    Instant instant = date.toInstant();
    System.out.println("Current:");
    System.out.println("Date: "+date);
    System.out.println("Instant: "+instant);
    System.out.println("Date epoch:    "+date.getTime());
    System.out.println("Instant epoch: "+instant.getEpochSecond()*1000);

    System.out.println("\nAncient from Date:");
    Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("MST"));
    cal.set(2, Calendar.NOVEMBER, 30, 0, 0, 0);
    date = cal.getTime();
    instant = date.toInstant();
    System.out.println("Date: "+date);
    System.out.println("Instant: "+instant);
    System.out.println("Date epoch:    "+date.getTime());
    System.out.println("Instant epoch: "+instant.getEpochSecond()*1000);

    System.out.println("\nAncient from Instant:");
    instant = Instant.parse("0002-11-30T00:00:00Z");
    date = Date.from(instant);
    System.out.println("Date: "+date);
    System.out.println("Instant: "+instant);
    System.out.println("Date epoch:    "+date.getTime());
    System.out.println("Instant epoch: "+instant.getEpochSecond()*1000);

Который печатает следующее:

Current:
Date: Tue Sep 18 12:34:27 MST 2018
Instant: 2018-09-18T19:34:27.177Z
Date epoch:    1537299267177
Instant epoch: 1537299267000

Ancient from Date:
Date: Thu Nov 30 00:00:00 MST 2
Instant: 0002-11-28T07:00:00.247Z
Date epoch:    -62075437199753
Instant epoch: -62075437200000

Ancient from Instant:
Date: Fri Dec 01 17:00:00 MST 2
Instant: 0002-11-30T00:00:00Z
Date epoch:    -62075289600000
Instant epoch: -62075289600000

Поэтому, если я создаю Момент 30 ноября 2, а затем преобразую его в Дата, Дата - 1 декабря 2. Если я начинаю с Даты 30 ноября 2, Момент - 28 ноября 2. Я знаю, что ни Дата, ни Мгновенное хранение информации о часовом поясе, но почему эпохи так отличаются в зависимости от того, начал ли я с даты против мгновенного? Могу ли я в любом случае обойти это? Мне нужно начинать с даты или с момента и заканчивать тем же значением эпохи. Также было бы неплохо узнать, почему по умолчанию toString () показывает такие разные даты для одной и той же эпохи.