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自带的DurationTimeUnit类获取所需的单位,并借助Formatter进行格式化。

最后,我们探讨了如何使用第三方库来达到同样的效果。

如往常一样,完整的源代码可在GitHub上找到。


« 上一篇: Java Weekly, 第401期
» 下一篇: 权限控制模型