2015-10-08 12 views
8

Domyślnie metoda toString z Instant używa formatera DateTimeFormatter.ISO_INSTANT. Że formater nie będzie drukować cyfry frakcja-of-sekundę, jeśli zdarzy ci się być 0.Format daty ISO ISO ze stałymi cyframi milimetra (w języku Java 8 i nowszych wersjach)

java-time przykładów:

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

Joda-Time przykłady (i czego można oczekiwać od java.time):

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

To jest naprawdę frustrujące, parsować w niektórych systemach. Elasticsearch to pierwszy napotkany problem, nie ma zdefiniowanego formatu, który obsługuje opcjonalne millisy, ale prawdopodobnie mogę obejść to w niestandardowym formacie. Ustawienie domyślne wydaje się błędne.

Wygląda na to, że tak naprawdę nie można tak naprawdę zbudować własnego ciągu formatów dla Instants. Czy jest to jedyna opcja implementująca mój własny java.time.format.DateTimeFormatterBuilder.InstantPrinterParser?

+0

Twoim celem jest znalezienie, czy data ma dokładność milisekundy? –

+0

Celem jest sformatowanie tej daty z ułamkową drugą częścią, nawet jeśli te milisekundy są równe 0. Innymi słowy, naśladuj to, co robi Joda. –

+1

Przypomnienie: java.time zapewnia rozdzielczość [nanosekund] (https://en.wikipedia.org/wiki/Nanosecond), w przeciwieństwie do rozdzielczości Jules-Time i java.util.Date w milisekundach. Oznacza to do dziewięciu (9) cyfr ułamkowej sekundy. Więc jeśli ograniczysz do 3, możesz ukrywać/tracić dane. Zobacz [ten schemat] (http://i.stack.imgur.com/OW0RW.png). –

Odpowiedz

7

Wystarczy utworzyć DateTimeFormatter, który przechowuje trzy cyfry ułamkowe.

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

Następnie użyj go. Na przykład:

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

... drukuje (w momencie uruchamiania go):

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

Wyciąg z class doc:

... Parametr fractionalDigits umożliwia wyjście drugiego frakcyjnej być kontrolowanym. Podanie wartości zero spowoduje, że nie będą wyprowadzane cyfry ułamkowe. Od 1 do 9 będzie wyświetlać rosnącą liczbę cyfr, w razie potrzeby za pomocą zerowego wypełnienia prawym. Specjalna wartość -1 jest używana do wyprowadzenia tylu cyfr, ile potrzeba, aby uniknąć końcowych zer. ...

Powiązane problemy