Discrepância ao converter datas antigas entre java.util.Date e java.time.Instant
Eu tenho código legado que usa java.util.Date criando uma data antiga (30 de novembro de 0002). Estou tentando atualizar o código que posso, mas isso exige conversão entre Date e LocalDate, etc. Não consigo me livrar completamente do uso de Date ou da escolha de data antiga.
Estou descobrindo o que parece ser um erro ao converter para frente e para trás entre Date e Instant com esta data antiga, e esperava que alguém pudesse explicar o que está acontecendo.
Aqui está uma amostra:
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);
Que imprime o seguinte:
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
Portanto, se eu criar um instante em 30 de novembro, 2 e depois converter para uma data, a data será 1 de dezembro de 2. Se eu começar com uma data em 30 de novembro, 2, o instantâneo será 28 de novembro. Estou ciente de que nem Data nem Armazenamento instantâneo de informações de fuso horário, mas por que as épocas são tão diferentes com base no fato de eu ter começado com uma Data vs. um Instantâneo? Existe alguma maneira de resolver isso? Preciso começar com uma data ou um instante e terminar com o mesmo valor de época. Também seria bom saber por que o toString () padrão mostra datas tão diferentes na mesma época.