Sto provando a ripulire un mix di vari codici attorno alla gestione datetime verso lo spazio dei nomi solo Java 8 java.time
. In questo momento ho un piccolo problema con il valore predefinito DateTimeFormatter
per Instant
. Il formattatore DateTimeFormatter.ISO_INSTANT
mostra solo i millisecondi quando non sono uguali a zero.java.time.DateTimeFormatter: Need ISO_INSTANT che esegue sempre i millisecondi
L'epoca è resa come 1970-01-01T00:00:00Z
anziché 1970-01-01T00:00:00.000Z
.
Ho effettuato un test unitario per spiegare il problema e il modo in cui è necessario che le date finali siano confrontate l'una con l'altra.
@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)));
}
}
Anche il formato predefinito restituisce nanosecondi se sono diversi da zero. Se vuoi sempre millisecondi (e mai nanosecondi), perché non usare semplicemente un formattatore personalizzato, come 'DateTimeFormatter formatter = DateTimeFormatter.ofPattern (" aaaa-MM-gg'T'HH: mm: ss.SSSX "). WithZone (ZoneId .di ("UTC")); '? – mihi
Volevo stare il più vicino possibile al formattatore usato per 'Instant :: toString()'. Forse avrei dovuto usare solo uno schema di corde. – Florent