java.time.DateTimeFormatter: é necessário ISO_INSTANT que sempre gera milissegundos

Estou tentando limpar uma mistura de vários códigos em torno do gerenciamento de data e hora para apenas o Java 8java.time namespace. No momento, tenho um pequeno problema com o padrãoDateTimeFormatter paraInstant. oDateTimeFormatter.ISO_INSTANT O formatador mostra apenas milissegundos quando eles não são iguais a zero.

A época é renderizada como1970-01-01T00:00:00Z ao invés de1970-01-01T00:00:00.000Z.

Fiz um teste de unidade para explicar o problema e como precisamos finalizar as datas para serem comparadas uma à outra.

@Test
public void java8Date() {
    DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;
    String epoch, almostEpoch, afterEpoch;

    { // before epoch
        java.time.Instant instant = java.time.Instant.ofEpochMilli(-1);
        almostEpoch = formatter.format(instant);
        assertEquals("1969-12-31T23:59:59.999Z", almostEpoch );
    }

    { // epoch
        java.time.Instant instant = java.time.Instant.ofEpochMilli(0);
        epoch = formatter.format(instant);
        // This fails, I get 1970-01-01T00:00:00Z instead
        assertEquals("1970-01-01T00:00:00.000Z", epoch );
    }

    { // after epoch
        java.time.Instant instant = java.time.Instant.ofEpochMilli(1);
        afterEpoch = formatter.format(instant);
        assertEquals("1970-01-01T00:00:00.001Z", afterEpoch );
    }

    // The end game is to make sure this rule is respected (this is how we order things in dynamo):
    assertTrue(epoch.compareTo(almostEpoch) > 0);
    assertTrue(afterEpoch.compareTo(epoch) > 0); // <-- This assert would also fail if the second assert fails

    { // to confirm we're not showing nanos
        assertEquals("1970-01-01T00:00:00.000Z", formatter.format(Instant.EPOCH.plusNanos(1)));
        assertEquals("1970-01-01T00:00:00.001Z", formatter.format(Instant.EPOCH.plusNanos(1000000)));
    }
}

questionAnswers(2)

yourAnswerToTheQuestion