Discrepancia al convertir fechas antiguas entre java.util.Date y java.time.Instant

Tengo un código heredado que usa java.util.Date creando una fecha antigua (30 de noviembre de 0002). Estoy tratando de actualizar el código que puedo, pero eso requiere la conversión entre Date y LocalDate, etc. No puedo deshacerme por completo del uso de Date o la opción de fecha antigua.

Estoy encontrando lo que parece ser un error al convertir de ida y vuelta entre Date e Instant con esta fecha antigua, y esperaba que alguien pudiera explicar lo que está sucediendo.

Aquí hay una muestra:

    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 lo siguiente:

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

Así que si creo un Instant al 30 de noviembre 2, luego lo convierto en una Fecha, la Fecha es el 1 de diciembre 2. Si empiezo con una Fecha al 30 de noviembre 2, el Instant es el 28 de noviembre 2. Sé que ninguna Fecha ni la información de la zona horaria de la tienda instantánea, pero ¿por qué las épocas son tan diferentes en función de si comencé con una fecha o una instantánea? ¿Hay alguna forma de evitar eso? Necesito poder comenzar con una fecha o un instante, y terminar con el mismo valor de época. También sería bueno saber por qué el valor predeterminado de toString () muestra fechas tan diferentes dada la misma época.

Respuestas a la pregunta(1)

Su respuesta a la pregunta