Как отформатировать продолжительность в Java? (например, формат H: MM: SS) - PullRequest
135 голосов
/ 06 ноября 2008

Я хотел бы отформатировать длительность в секундах, используя шаблон типа H: MM: SS. Текущие утилиты в Java предназначены для форматирования времени, но не продолжительности.

Ответы [ 17 ]

1 голос
/ 29 июня 2018

Этот ответ использует только Duration методы и работает с Java 8:

public static String format(Duration d) {
    long days = d.toDays();
    d = d.minusDays(days);
    long hours = d.toHours();
    d = d.minusHours(hours);
    long minutes = d.toMinutes();
    d = d.minusMinutes(minutes);
    long seconds = d.getSeconds() ;
    return 
            (days ==  0?"":days+" jours,")+ 
            (hours == 0?"":hours+" heures,")+ 
            (minutes ==  0?"":minutes+" minutes,")+ 
            (seconds == 0?"":seconds+" secondes,");
}
1 голос
/ 24 апреля 2017
String duration(Temporal from, Temporal to) {
    final StringBuilder builder = new StringBuilder();
    for (ChronoUnit unit : new ChronoUnit[]{YEARS, MONTHS, WEEKS, DAYS, HOURS, MINUTES, SECONDS}) {
        long amount = unit.between(from, to);
        if (amount == 0) {
            continue;
        }
        builder.append(' ')
                .append(amount)
                .append(' ')
                .append(unit.name().toLowerCase());
        from = from.plus(amount, unit);
    }
    return builder.toString().trim();
}
0 голосов
/ 25 октября 2018

В Scala, основанная на решении YourBestBet, но упрощенная:

def prettyDuration(seconds: Long): List[String] = seconds match {
  case t if t < 60      => List(s"${t} seconds")
  case t if t < 3600    => s"${t / 60} minutes" :: prettyDuration(t % 60)
  case t if t < 3600*24 => s"${t / 3600} hours" :: prettyDuration(t % 3600)
  case t                => s"${t / (3600*24)} days" :: prettyDuration(t % (3600*24))
}

val dur = prettyDuration(12345).mkString(", ") // => 3 hours, 25 minutes, 45 seconds
0 голосов
/ 03 апреля 2018

в 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("")
0 голосов
/ 20 февраля 2019

Существует довольно простой и (ИМО) элегантный подход, по крайней мере, для продолжительности менее 24 часов:

DateTimeFormatter.ISO_LOCAL_TIME.format(value.addTo(LocalTime.of(0, 0)))

Для форматирования нужен временный объект для форматирования, так что вы можете создать его, добавив продолжительность к LocalTime 00:00 (т.е. полночь). Это даст вам LocalTime, представляющий продолжительность от полуночи до этого времени, которую затем легко отформатировать в стандартной записи HH: mm: ss. Преимуществом этого является отсутствие необходимости во внешней библиотеке, и для выполнения расчетов используется библиотека java.time вместо ручного вычисления часов, минут и секунд.

0 голосов
/ 21 мая 2019

Я этого не видел, поэтому подумал добавить:

Date started=new Date();
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
task
long duration=new Date().getTime()-started.getTime();
System.out.println(format.format(new Date(duration));

Это работает только в течение 24 часов, но это то, что я обычно хочу на время.

0 голосов
/ 14 ноября 2016

Моя библиотека 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

Этот код демонстрирует возможности для обработки переполнения часа и обработки знаков, см. Также API-интерфейс длительности-форматера на основе шаблона .

...