java.time.Duration
Как показано в связанных вопросах, есть несколько способов сделать это. Боюсь, что не существует одного объективно лучшего способа.
Скорее всего, вы должны использовать Duration
из java.time, современного API даты и времени Java, для своей продолжительности.
К сожалению, нет способа проанализировать вашу строку непосредственно в Duration
. Я предпочитаю модифицировать вашу строку в формате ISO 8601 , формате, который класс Duration
знает, как анализировать. Я верю, что вы переведете мой Java-код в еще более красивый код Kotlin.
String timeString = "00:01:08.83";
String isoDurationString = timeString
.replaceFirst("(\\d+):(\\d{2}):(\\d{2}(?:\\.\\d+)?)", "PT$1H$2M$3S");
Duration dur = Duration.parse(isoDurationString);
System.out.println(dur);
Вывод этого фрагмента:
PT1M8.83S
Регулярное выражение мощно, но трудно читать. Круглые скобки обозначают группы, которые я хочу сохранить в измененной строке;Я называю их $1
и т. Д. В строке замены. (?:\\.\\d+)
- это группа без захвата , которую мне не нужно использовать при замене. ?
после группы без захвата говорит, что его там не должно быть (поэтому выражение также совпадает только с 00:01:08
).
Для процента снова есть некоторые опции. Duration
объекты могут быть непосредственно умножены на 100, а Java 9 делится друг на друга. Предполагая, что вы еще не работаете на Java 9, я бы, вероятно, сделал расчет на основе миллисекунд или наносекунд (а не секунд с дробью). Например:
long totalMilliseconds = dur.toMillis();
System.out.println(totalMilliseconds);
68830
Однако, чтобы ответить на ваш вопрос, вот как я бы преобразовал в секунды в float
:
float totalSeconds = ((float) dur.toNanos()) / TimeUnit.SECONDS.toNanos(1);
System.out.println(totalSeconds);
68,83