Разбор (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
метод.