Разбор (ss.nnn) секунды и наносекунды в Java 8

Я пытаюсь проанализировать секунду и наносекунду, т. Е. 10.337000, где 10 - это секунда, а 337000 - это наносекунды в Java 8. Я не могу понять, как я должен анализировать эти значения в LocalTime,

я пытался DateTimeFormatter.ofPattern("ss:nnnnnn"), но это не сработало.

1 ответ

Решение

Есть несколько вариантов.

Если ваша строка времени обозначает количество времени

Для продолжительности, количества времени (в днях, часах, минутах, секундах и / или долях секунды) Duration класс в java.time является правильным для использования:

    String timeString = "10.337000";
    Duration amountOfTime = Duration.parse("PT" + timeString + "S");
    System.out.println("Duration: " + amountOfTime);
    System.out.println("Seconds: " + amountOfTime.getSeconds());
    System.out.println("Nanos: " + amountOfTime.getNano());

Это печатает

Duration: PT10.337S
Seconds: 10
Nanos: 337000000

Мы получили 337000000 наносекунд. Я предполагаю, что это правильно, поскольку в секунду происходит 1000 000 000 наносекунд (миллионная секунда называется микросекундой).

Duration класс имеет ограниченные возможности разбора и форматирования. Он анализирует формат ISO 8601, который выглядит как PT10.337000SПоэтому я просто поставил правильные буквы перед и в конце вашей строки, и это сработало. Вы видите Duration.toString() также печатает тот же формат обратно (пропуская лишние 0 десятичных знаков).

Если ваша строка времени обозначает время суток

Вы просили LocalTime, LocalTime для часа дня, так что если вы намеревались на 10.337 секунд после полуночи, это правильный класс для использования. Одним из простых вариантов является добавление строки в соответствии с форматом ISO 8601 на какое-то время без смещения от UTC, аналогично тому, что я делал для этой продолжительности:

    LocalTime time = LocalTime.parse("00:00:" + timeString);

Это дает LocalTime из

00:00:10.337

Снова, toString() просто дает столько групп по три знака после запятой, сколько необходимо для отображения полной точности.

Вы упомянули использование DateTimeFormatterи вы можете придерживаться этой идеи. Это позволит вам собрать ваш форматтер один раз в одном месте и использовать его в других местах кода, не беспокоясь о добавлении строки. Нам нужно указать форматеру, чтобы установить минуты и часы равными 0, и для этого нам нужно пройти через DateTimeFormatterBuilder:

    DateTimeFormatter timeParser = new DateTimeFormatterBuilder()
            .appendPattern("s.SSSSSS")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .toFormatter();
    LocalTime time = LocalTime.parse(timeString, timeParser);

Это дает точно такой же результат, как и раньше, LocalTime от 00:00 до 10,337.

Форматировщик в этом фрагменте требует ровно 6 десятичных знаков в секундах (так как есть 6 заглавных S после десятичной точки). Если ваше количество десятичных знаков может отличаться, вам нужно DateTimeFormatterBuilder.appendFraction метод.

Другие вопросы по тегам