1. 概述
时间持续长度可以用小时、分钟、秒、毫秒等单位表示。我们可能需要将给定的时间长度格式化成特定的模式。
我们可以通过使用一些JDK库编写自定义代码,或者利用第三方库来实现这一目标。
在这个快速教程中,我们将探讨如何编写简单的代码,将给定的持续时间格式化为HH:MM:SS格式。
2. Java解决方案
时间长度可以以多种方式表达,比如分钟、秒或毫秒,以及Java的Duration
类所特有的格式。本节及后续章节将专注于使用JDK库将指定为毫秒的间隔(经过的时间)格式化为HH:MM:SS。为了示例,我们将格式化38114000毫秒为10:35:14(HH:MM:SS)。
2.1. Duration
从Java 8开始,引入了Duration
类来处理不同单位的时间间隔。 Duration
类提供了许多辅助方法,用于从时间长度获取小时、分钟和秒。
要使用Duration
类将间隔格式化为HH:MM:SS,我们需要使用Duration
类中的工厂方法ofMillis()
,从我们的间隔创建一个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. 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
类中提供了formatDuration
等其他单位格式化方法:
String timeInHHMMSS = DurationFormatUtils.formatDuration(38114000, "HH:MM:SS", true);
assertThat(timeInHHMMSS).isEqualTo("10:35:14");
3.2. Joda Time
对于使用Java 8之前版本的情况,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
进行格式化。
最后,我们探讨了如何使用第三方库来达到同样的效果。
如往常一样,完整的源代码可在GitHub上找到。