199

H:MM:SS のようなパターンを使用して、デュレーションを秒単位でフォーマットしたいと思います。Java の現在のユーティリティは、時間をフォーマットするように設計されていますが、期間をフォーマットするようには設計されていません。

4

22 に答える 22

217

ライブラリをドラッグしたくない場合は、フォーマッターまたは関連するショートカットを使用して自分で行うのは簡単です。指定された整数秒数 s:

  String.format("%d:%02d:%02d", s / 3600, (s % 3600) / 60, (s % 60));
于 2008-11-05T22:28:52.183 に答える
93

8より前のバージョンのJavaを使用している場合は、JodaTimeとを使用できますPeriodFormatter。あなたが本当に期間を持っているなら(すなわち、カレンダーシステムを参照せずに経過した時間)、あなたはおそらくDurationほとんどの部分を使用しているはずです-それからあなたは電話することができます( 25時間がなるかどうかを反映したいものをtoPeriod指定してくださいPeriodType1日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を使用できます。

于 2008-11-05T21:49:32.030 に答える
27
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())));
于 2011-05-22T19:22:35.100 に答える
4

これは有効なオプションです。

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
于 2014-04-01T03:02:32.440 に答える
0

私のライブラリ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 も参照してください。

于 2016-11-14T17:59:02.513 に答える
-4

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("")
于 2018-04-03T11:11:54.590 に答える