Java LocalDateTime.parse с точностью до миллисекунды, но с дополнительной точностью до микросекунды - PullRequest
0 голосов
/ 14 февраля 2019

Есть ли способ создать шаблон LocalDateTime, который будет анализировать дату / время с точностью не менее миллисекунды, но с дополнительной точностью до микросекунды, т. Е. В следующие миллисекунды дата / время анализируются нормально, но вторая в микросекундах дает сбой.Я думал, что дополнительные индикаторы в шаблоне "[" "]" позволят эту работу:

DateTimeFormatter DATE_TIME_FORMATTER = 
    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS[SSS]");
System.out.println(LocalDateTime.parse("2019-02-14 11:04:52.784", DATE_TIME_FORMATTER));     
System.out.println(LocalDateTime.parse("2019-02-14 11:04:52.784108", DATE_TIME_FORMATTER));

1 Ответ

0 голосов
/ 14 февраля 2019

Hack нет.1

    String withMillis = "2019-02-14 11:04:52.784";
    String withMicros = "2019-02-14 11:04:52.784108";

    System.out.println(LocalDateTime.parse(withMillis.replace(' ', 'T')));
    System.out.println(LocalDateTime.parse(withMicros.replace(' ', 'T')));
2019-02-14T11:04:52.784
2019-02-14T11:04:52.784108

Когда мы заменяем пробел в середине вашей строки на T, строка соответствует ISO 8601, стандартному формату LocalDateTimeи другие классы java.time анализируют (и также печатают) по умолчанию, то есть без какого-либо явного средства форматирования.Так что это простое решение.

Взломать нет.2

Нечто подобное тому, что вы пробовали, можно заставить работать.Только вы не можете разбить последовательность SSSSSS с квадратной скобкой посередине.

static final DateTimeFormatter DATE_TIME_FORMATTER = 
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.[SSSSSS][SSS]");

И затем:

    System.out.println(LocalDateTime.parse(withMillis, DATE_TIME_FORMATTER));     
    System.out.println(LocalDateTime.parse(withMicros, DATE_TIME_FORMATTER));

Я могу указать дополнительно 6 десятичных знаков, а затем, возможно, 3 десятичных знака.Нам нужен этот заказ.Если мы введем [SSS][SSSSSS] и попытаемся выполнить синтаксический анализ 6 десятичных разрядов, модуль форматирования сначала проанализирует 3, а затем сгенерирует исключение, поскольку он не может проанализировать оставшиеся 3 с помощью SSSSSS.Это что-то вроде хака, поскольку он также примет десятичную точку без десятичных дробей вообще и, вероятно, выдаст очень запутанное сообщение об ошибке (или, возможно, даже даст неправильный результат), если мы дадим ему 9 десятичных знаков.

Хорошее решение: используйте строитель

static final DateTimeFormatter DATE_TIME_FORMATTER = 
        new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE)
                .appendLiteral(' ')
                .appendPattern("HH:mm:ss")
                .appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true)
                .toFormatter();

Здесь я указал минимум 1 и максимум 9 десятичных знаков после десятичной точки.Вы можете указать 3 и 6, если хотите.Конечно, он также принимает 4 или 5.

Ссылка: Статья в Википедии: ISO 8601

...