Перейти к основному содержимому

Форматировать продолжительность в миллисекундах в ЧЧ:ММ:СС

· 4 мин. чтения

1. Обзор

Длительность — это количество времени, выраженное в часах, минутах, секундах, миллисекундах и т. д. Мы можем захотеть отформатировать продолжительность в какой-то конкретный шаблон времени.

Мы можем добиться этого, либо написав собственный код с помощью некоторых библиотек JDK, либо используя сторонние библиотеки.

В этом кратком руководстве мы рассмотрим, как написать простой код для форматирования заданной длительности в формате ЧЧ:ММ:СС.

2. Java-решения

Существует несколько способов выражения длительности — например, в минутах, секундах и миллисекундах или в виде длительности Java , которая имеет свой собственный формат.

В этом и последующих разделах основное внимание будет уделено форматированию интервалов (истекшего времени), указанных в миллисекундах, в ЧЧ:ММ:СС с использованием некоторых библиотек JDK. Для наших примеров мы будем форматировать 38114000 мс как 10:35:14 (ЧЧ:ММ:СС).

2.1. Продолжительность

Начиная с Java 8, класс Duration был представлен для обработки интервалов времени в различных единицах измерения. Класс Duration содержит множество вспомогательных методов для получения часов, минут и секунд из длительности.

Чтобы отформатировать интервал в ЧЧ:ММ:СС с помощью класса Duration , нам нужно инициализировать объект Duration из нашего интервала с помощью фабричного метода Миллиса, найденного в классе Duration . Это преобразует интервал в объект Duration , с которым мы можем работать:

Duration duration = Duration.ofMillis(38114000);

Для простоты расчета от секунд до желаемых единиц нам нужно получить общее количество секунд в нашей продолжительности или интервале:

long seconds = duration.getSeconds();

Затем, получив количество секунд, мы генерируем соответствующие часы, минуты и секунды для желаемого формата:

long HH = seconds / 3600;
long MM = (seconds % 3600) / 60;
long SS = seconds % 60;

Наконец, мы форматируем наши сгенерированные значения:

String timeInHHMMSS = String.format("%02d:%02d:%02d", HH, MM, SS);

Давайте попробуем это решение:

assertThat(timeInHHMMSS).isEqualTo("10:35:14");

Если мы используем Java 9 или более позднюю версию, мы можем использовать некоторые вспомогательные методы для прямого получения единиц измерения без выполнения каких-либо вычислений :

long HH = duration.toHours();
long MM = duration.toMinutesPart();
long SS = duration.toSecondsPart();
String timeInHHMMSS = String.format("%02d:%02d:%02d", HH, MM, SS);

Приведенный выше фрагмент даст нам тот же результат, что и проверенный выше:

assertThat(timeInHHMMSS).isEqualTo("10:35:14");

2.2. Единица времени

Как и класс Duration , рассмотренный в предыдущем разделе, TimeUnit представляет время с заданной степенью детализации. Он предоставляет несколько вспомогательных методов для преобразования единиц измерения — в нашем случае это будут часы, минуты и секунды — и для выполнения операций синхронизации и задержки в этих единицах.

Чтобы отформатировать продолжительность в миллисекундах в формате ЧЧ:ММ:СС, все, что нам нужно сделать, это использовать соответствующие вспомогательные методы в TimeUnit :

long HH = TimeUnit.MILLISECONDS.toHours(38114000);
long MM = TimeUnit.MILLISECONDS.toMinutes(38114000) % 60;
long SS = TimeUnit.MILLISECONDS.toSeconds(38114000) % 60;

Затем отформатируйте продолжительность на основе сгенерированных единиц выше:

String timeInHHMMSS = String.format("%02d:%02d:%02d", HH, MM, SS);
assertThat(timeInHHMMSS).isEqualTo("10:35:14");

3. Использование сторонних библиотек

Мы можем попробовать другой маршрут, используя методы сторонних библиотек, а не писать свои собственные.

3.1. Апач Коммонс

Чтобы использовать Apache Commons , нам нужно добавить в наш проект commons-lang3 :

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>

Как и ожидалось, эта библиотека имеет formatDuration , а также другие методы форматирования модулей в своем классе DurationFormatUtils :

String timeInHHMMSS = DurationFormatUtils.formatDuration(38114000, "HH:MM:SS", true);
assertThat(timeInHHMMSS).isEqualTo("10:35:14");

3.2. Джода Тайм

Библиотека Joda Time удобна, когда мы используем версию Java до Java 8, благодаря ее удобным вспомогательным методам для представления и форматирования единиц времени. Чтобы использовать Joda Time, давайте добавим в наш проект зависимость joda-time :

<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.10</version>
</dependency>

Joda Time имеет класс Duration для представления времени. Во-первых, мы преобразуем интервал в миллисекундах в экземпляр объекта Joda Time Duration :

Duration duration = new Duration(38114000);

Затем мы получаем период из продолжительности выше, используя метод toPeriod в Duration , который преобразует или инициализирует его в экземпляр класса Period в Joda Time:

Period period = duration.toPeriod();

Мы получаем единицы измерения (часы, минуты и секунды) из Period , используя соответствующие вспомогательные методы:

long HH = period.getHours();
long MM = period.getMinutes();
long SS = period.getSeconds();

Наконец, мы можем отформатировать продолжительность и проверить результат:

String timeInHHMMSS = String.format("%02d:%02d:%02d", HH, MM, SS);
assertThat(timeInHHMMSS).isEqualTo("10:35:14");

4. Вывод

В этом руководстве мы узнали, как отформатировать продолжительность в определенном формате (в нашем случае ЧЧ:ММ:СС).

Во- первых, мы использовали классы Duration и TimeUnit , которые поставляются с Java, чтобы получить необходимые единицы измерения и отформатировать их с помощью Formatter .

Наконец, мы рассмотрели, как использовать некоторые сторонние библиотеки для достижения результата.

Как обычно, полный исходный код доступен на GitHub .