Próbuję oczyścić miks różnych kodów związanych z zarządzaniem datetime tylko w przestrzeni nazw Java 8 java.time
. W tej chwili mam mały problem z domyślnym DateTimeFormatter
dla Instant
. Formater DateTimeFormatter.ISO_INSTANT
wyświetla tylko milisekundy, gdy nie są równe zeru.java.time.DateTimeFormatter: Potrzebujesz ISO_INSTANT, który zawsze wyrenderowuje milisekundy
Epoka jest wyświetlana jako 1970-01-01T00:00:00Z
zamiast 1970-01-01T00:00:00.000Z
.
Zrobiłem test jednostkowy, aby wyjaśnić problem i sposób, w jaki potrzebujemy do ostatecznych dat, które należy porównać jeden z drugim.
@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)));
}
}
Domyślny format będzie również wyświetlał nanosekundy tylko wtedy, gdy różnią się od zera. Jeśli zawsze potrzebujesz milisekund (i nigdy nie nanosekund), możesz po prostu użyć niestandardowego formatera, np. 'DateTimeFormatter formatter = DateTimeFormatter.ofPattern (" rrrr-MM-dd'T'HH: mm: ss.SSSX ") .zZone (ZoneId ofof ("UTC")); '? – mihi
Chciałem pozostać jak najbliżej formatera użytego do 'Instant :: toString()'. Może powinienem rzeczywiście użyć wzoru smyczkowego. – Florent