2015-10-08 9 views
8

Per impostazione predefinita, il metodo toString di Instant utilizza il formatter DateTimeFormatter.ISO_INSTANT. Che formattatore non stamperà le cifre per la frazione-di-secondo se capita di essere 0.java.time Formato data ISO con cifre millisecure fisse (in Java 8 e versioni successive)

java-time esempi:

2015-10-08T17:13:07.589Z 
    2015-10-08T17:13:07Z 

Joda-Time esempi (e quello che mi aspetto da java.time):

2015-10-08T17:13:07.589Z 
    2015-10-08T17:13:07.000Z 

Questo è davvero frustrante per analizzare in alcuni sistemi. Elasticsearch è stato il primo problema che ho riscontrato, non esiste un formato predefinito che supporti i millis facoltativi, ma probabilmente posso aggirarlo con un formato personalizzato. L'impostazione predefinita sembra sbagliata.

Sembra che non sia possibile creare la propria stringa di formato per Instants in ogni caso. È l'unica opzione che implementa il mio java.time.format.DateTimeFormatterBuilder.InstantPrinterParser?

+0

Il tuo obiettivo è scoprire se la data ha una precisione millisecondo? –

+0

L'obiettivo è formattare quella data con la seconda parte frazionaria anche se quei millisecondi sono uguali a 0. In altre parole, imitare ciò che fa Joda. –

+1

Promemoria rapido: java.time fornisce una risoluzione di [nanosecondi] (https://en.wikipedia.org/wiki/Nanosecond), in contrasto con la risoluzione dei millisecondi di Joda-Time e java.util.Date. Ciò significa fino a nove (9) cifre di un secondo frazionario. Quindi, se limiti a 3, potresti nascondere/perdere dati. Vedi [questo mio schema] (http://i.stack.imgur.com/OW0RW.png). –

risposta

7

Basta creare un DateTimeFormatter che mantiene tre cifre frazionarie.

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendInstant(3).toFormatter(); 

Quindi utilizzarlo. Per esempio:

System.out.println(formatter.format(Instant.now())); 
System.out.println(formatter.format(Instant.now().truncatedTo(ChronoUnit.SECONDS))); 

... stampa (al momento ho eseguirlo):

2015-10-08T21:26:16.571Z 
2015-10-08T21:26:16.000Z 

Estratto del class doc:

... Il parametro fractionalDigits permette l'uscita del secondo frazionale essere controllato Specificando zero non si generano cifre frazionarie. Da 1 a 9 verrà generato un numero crescente di cifre, utilizzando zero pad a destra se necessario. Il valore speciale -1 viene utilizzato per generare il numero di cifre necessario per evitare zero finali. ...

Problemi correlati