1. 概要

期間は、時間、分、秒、ミリ秒などで表される時間の長さです。 期間を特定の時間パターンにフォーマットしたい場合があります。

これは、一部のJDKライブラリを使用してカスタムコードを作成するか、サードパーティのライブラリを利用することで実現できます。

このクイックチュートリアルでは、特定の期間をHH:MM:SS形式にフォーマットする簡単なコードを作成する方法を見ていきます。

2. Javaソリューション

期間を表す方法は複数あります。たとえば、分、秒、ミリ秒で表す方法や、独自の形式を持つJava Durationとして表す方法があります。

このセクションと後続のセクションでは、ミリ秒単位で指定された、いくつかのJDKライブラリを使用したHH:MM:SSへのフォーマット間隔(経過時間)に焦点を当てます。 例として、38114000msを10:35:14(HH:MM:SS)としてフォーマットします。

2.1. 期間

Java 8以降、Durationクラスは、さまざまな単位で時間間隔を処理するために導入されました。 duration クラスには、時間、分、秒を取得するための多くのヘルパーメソッドが付属しています。期間から。

duration クラスを使用して間隔をHH:MM:SSにフォーマットするには、にあるファクトリメソッドofMillisを使用して間隔から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. 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>

予想どおり、このライブラリには formatDuration と、DurationFormatUtilsクラスの他のユニットフォーマットメソッドがあります。

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

3.2. ジョーダタイム

Joda Timeライブラリは、Java 8 より前のJavaバージョンを使用している場合に便利です。これは、時間の単位を表現およびフォーマットするための便利なヘルパーメソッドがあるためです。 Joda Timeを使用するには、joda-time依存関係をプロジェクトに追加しましょう。

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

Joda Timeには、時間を表すDutyクラスがあります。 まず、ミリ秒単位の間隔をJoda Time Durationオブジェクトのインスタンスに変換します。

Duration duration = new Duration(38114000);

次に、durationtoPeriodメソッドを使用して、上記の期間から期間を取得します。このメソッドは、JodaTimeの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から入手できます。