H:MM:SS のようなパターンを使用して、デュレーションを秒単位でフォーマットしたいと思います。Java の現在のユーティリティは、時間をフォーマットするように設計されていますが、期間をフォーマットするようには設計されていません。
22 に答える
ライブラリをドラッグしたくない場合は、フォーマッターまたは関連するショートカットを使用して自分で行うのは簡単です。指定された整数秒数 s:
String.format("%d:%02d:%02d", s / 3600, (s % 3600) / 60, (s % 60));
8より前のバージョンのJavaを使用している場合は、JodaTimeとを使用できますPeriodFormatter
。あなたが本当に期間を持っているなら(すなわち、カレンダーシステムを参照せずに経過した時間)、あなたはおそらくDuration
ほとんどの部分を使用しているはずです-それからあなたは電話することができます( 25時間がなるかどうかを反映したいものをtoPeriod
指定してくださいPeriodType
1日1時間かどうかなど)、Period
フォーマット可能なを取得します。
Java 8以降を使用している場合:通常java.time.Duration
、期間を表すためにを使用することをお勧めします。次に、必要に応じて、bobinceの回答に従って、標準の文字列フォーマット用の整数を取得するなどを呼び出すことができます。ただし、出力文字列に単一のgetSeconds()
負の符号が必要になる可能性があるため、期間が負の状況に注意する必要があります。 。だから次のようなもの:
public static String formatDuration(Duration duration) {
long seconds = duration.getSeconds();
long absSeconds = Math.abs(seconds);
String positive = String.format(
"%d:%02d:%02d",
absSeconds / 3600,
(absSeconds % 3600) / 60,
absSeconds % 60);
return seconds < 0 ? "-" + positive : positive;
}
煩わしい手動の場合、この方法でのフォーマットはかなり簡単です。構文解析に関しては、一般的に難しい問題になります...もちろん、必要に応じて、Java8でもJodaTimeを使用できます。
long duration = 4 * 60 * 60 * 1000;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault());
log.info("Duration: " + sdf.format(new Date(duration - TimeZone.getDefault().getRawOffset())));
これは有効なオプションです。
public static String showDuration(LocalTime otherTime){
DateTimeFormatter df = DateTimeFormatter.ISO_LOCAL_TIME;
LocalTime now = LocalTime.now();
System.out.println("now: " + now);
System.out.println("otherTime: " + otherTime);
System.out.println("otherTime: " + otherTime.format(df));
Duration span = Duration.between(otherTime, now);
LocalTime fTime = LocalTime.ofNanoOfDay(span.toNanos());
String output = fTime.format(df);
System.out.println(output);
return output;
}
でメソッドを呼び出します
System.out.println(showDuration(LocalTime.of(9, 30, 0, 0)));
次のようなものを生成します。
otherTime: 09:30
otherTime: 09:30:00
11:31:27.463
11:31:27.463
私のライブラリTime4Jは、パターンベースのソリューションを提供します (に似てApache DurationFormatUtils
いますが、より柔軟です):
Duration<ClockUnit> duration =
Duration.of(-573421, ClockUnit.SECONDS) // input in seconds only
.with(Duration.STD_CLOCK_PERIOD); // performs normalization to h:mm:ss-structure
String fs = Duration.formatter(ClockUnit.class, "+##h:mm:ss").format(duration);
System.out.println(fs); // output => -159:17:01
このコードは、時間オーバーフローと符号処理を処理する機能を示しています。 pattern に基づくduration-formatter の API も参照してください。
scala では、ライブラリは必要ありません:
def prettyDuration(str:List[String],seconds:Long):List[String]={
seconds match {
case t if t < 60 => str:::List(s"${t} seconds")
case t if (t >= 60 && t< 3600 ) => List(s"${t / 60} minutes"):::prettyDuration(str, t%60)
case t if (t >= 3600 && t< 3600*24 ) => List(s"${t / 3600} hours"):::prettyDuration(str, t%3600)
case t if (t>= 3600*24 ) => List(s"${t / (3600*24)} days"):::prettyDuration(str, t%(3600*24))
}
}
val dur = prettyDuration(List.empty[String], 12345).mkString("")