2015-10-08 1 views
8

По умолчанию метод toStringInstant использует форматер DateTimeFormatter.ISO_INSTANT. Это форматировщик не будет печатать цифры для фракции-в-секунду, если они происходят, чтобы быть 0.java.time формат даты ISO с фиксированными цифрами миллиса (в Java 8 и более поздних)

java-time примеры:

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

Joda-Time примеры (и то, что я бы ожидать от java.time):

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

Это действительно расстраивает синтаксический анализ в некоторых системах. Elasticsearch была первой проблемой, с которой я столкнулся, нет предопределенного формата, который поддерживает дополнительные миллисы, но я, вероятно, могу обойти это с помощью специального формата. По умолчанию просто неправильно.

Похоже, что вы действительно не можете создать собственную строку формата для Instants. Единственный вариант, реализующий мой собственный java.time.format.DateTimeFormatterBuilder.InstantPrinterParser?

+0

Ваша цель - просто найти, имеет ли эта цифра миллисекунду точность? –

+0

Цель состоит в том, чтобы форматировать эту дату с дробной второй частью, даже если эти миллисекунды равны 0. Другими словами, имитируйте то, что делает Джода. –

+1

Быстрое напоминание: java.time обеспечивает разрешение [nanoseconds] (https://en.wikipedia.org/wiki/Nanosecond), в отличие от миллисекундного разрешения Joda-Time & java.util.Date. Это означает до девяти (9) цифр дробной секунды. Поэтому, если вы ограничены до 3, вы можете скрывать/потерять данные. См. [Эту мою схему] (http://i.stack.imgur.com/OW0RW.png). –

ответ

7

Просто создайте DateTimeFormatter, который хранит три дробные цифры.

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

Тогда используйте его. Например:

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

... печатает (в то время я запустить его):

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

Отрывок из class doc:

... Параметр fractionalDigits позволяет выводить дробную секунду для контроля. Указание нуля не приведет к выходу дробных цифр. От 1 до 9 выводит все большее количество цифр, используя нулевое правое заполнение, если необходимо. Специальное значение -1 используется для вывода как можно большего количества цифр, чтобы избежать любых конечных нулей. ...