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 .