ミリ秒の期間をHH:MM:SSにフォーマットします
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);
次に、durationのtoPeriodメソッドを使用して、上記の期間から期間を取得します。このメソッドは、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でから入手できます。