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 () показывает такие разные даты для одной и той же эпохи.