开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情
1. 概述
持续时间是用小时、分钟、秒、毫秒等表示的时间量。我们可能希望将持续时间格式化为某种特定格式的时间模式。
我们可以通过在一些JDK库的帮助下编写自宝代码或使用第三方库来实现这一点。
在本文中,我们将了解如何编写简单代码将给定持续时间格式化为HH:MM:SS格式。
2. Java解决方案
有多种方式可以表示持续时间,例如,以分钟、秒和毫秒为单位,或者用Java中的Duration,它有自己特定的格式。
本文重点关注使用某些JDK库将间隔(经过的时间)格式化为HH:MM:SS,以毫秒为单位指定。举例来谙,将381140000ms格式化为10:35:14(HH:MM:SS)
2.1. Duration
从Java8开始,引入了Duration类来处理各种单位的时间间隔。Duration类带有很多辅助方法来从持续时间中获取小时、分钟和秒。
要使用Duration类将间隔格式化为HH:MM:SS,我们需要使用Duration类中的工厂方法ofMillis从我们的间隔中初始化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");
如何我们使用的是Java9或者更高版本,我们可以使用一些辅助方法直接获取单位而无需执行任何计算:
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. TimeUnit
就像上一节中讨论的Duration类一样,TimeUnit表示给定粒度的时间。它提供了一些辅助方法来跨单位转换,在我们的例子中是小时、分钟和秒,并在这些单位中执行计时和延迟操作。
要将以毫秒为单位的持续时间格式化为HH:MM:SS格式,我们需要做的就是使用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
为了使用Apache Commons,我们需要不回commons-lang3依赖到我们的工程:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
正如预期的那样,该库在DurationFormatUtils类中具有dormatDuration以及其他单位格式化方法:
String timeInHHMMSS = DurationFormatUtils.formatDuration(38114000, "HH:MM:SS", true);
assertThat(timeInHHMMSS).isEqualTo("10:35:14");
3.2. Joda Time
当我们使用Java8之前的版本时,Joda Time库会派上用场,因为它有方便的辅助方法来表示和格式化时间单位。要使用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);
然后,我们使用Duration中的toPeriod方法从上面的持续时间中获取周期,该方法将其转换或初始化为Joda Time中的Period类的实例:
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. 总结
在本文中,我们了解了如何将持续时间格式化为特定格式(HH:MM:SS)。
首先,我们使用Java自带的Duration和TimeUnit类获取所需的单位,并借助Formatter对其进行格式化。
最后,我们研究了如何vwget一些第三方库来实现。