Средство форматирования LocalDateTime, которое всегда возвращает не менее миллисекунд

Мне нужно создать средство форматирования, которое для каждого объекта LocalDateTime будет печатать как минимум с точностью до миллисекунд или более, если доступно (в формате ISO).

Например, я ожидаю следующее

LocalDateTime.parse("2018-01-01T00:00:00").format(...) // 2018-01-01T00:00:00.000
LocalDateTime.parse("2018-01-01T00:00:00.123456").format(...) // 2018-01-01T00:00:00.123456

Ответ на java.time.DateTimeFormatter: нужен ISO_INSTANT, который всегда отображает миллисекунды бесполезно, как и для ZonedDateTime. Также шаблон yyyy-MM-dd'T'HH:mm:ss.SSS у меня не работает, так как он обрезает микро и нано.


person Michal Kordas    schedule 25.01.2018    source источник


Ответы (2)


Вы можете построить DateTimeFormatter таким образом, чтобы добиться эффекта печати не менее миллисекунд:

DateTimeFormatter dtf =
    new DateTimeFormatterBuilder().appendPattern("uuuu-MM-dd'T'HH:mm:ss").appendFraction(
        ChronoField.NANO_OF_SECOND,
        3,
        9,
        true
    ).toFormatter();

String s1 = LocalDateTime.parse("2018-01-01T00:00:00").format(dtf);
String s2 = LocalDateTime.parse("2018-01-01T00:00:00.123456").format(dtf);  

System.out.println(s1); // 2018-01-01T00:00:00.000
System.out.println(s2); // 2018-01-01T00:00:00.123456
person Meno Hochschild    schedule 25.01.2018

Параметр представляет собой букву «n», расположенную от 1 до 9 раз, что дает наносекунды. Если указано менее 9 раз, значение наносекунд будет усечено до длины числа 'n'. "SSS" тоже должен работать. Формат не зависит от того, какой класс вы его используете, поэтому ZonedDateTime или LocalDateTime должны работать одинаково, за исключением полей, специфичных для некоторого класса, например, в этом случае часовой пояс присутствует только в ZonedDateTime, а не в LocalDateTime. В любом случае вы можете прочитать об этом здесь: Класс DateTimeFormatter

person Michael Gantman    schedule 25.01.2018
comment
Чтобы добавить к проблеме, меня однажды попросили написать парсер даты для строки, не зная заранее формата, т.е. Мне нужно было проверить, представляет ли строка дату в любом известном формате, и проанализировать ее. Я успел написать такую ​​фичу и написал статью, объясняющую принцип моей конструкции. Вот ссылка на статью: linkedin.com/pulse/ - person Michael Gantman; 25.01.2018