Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как вывести длительность в часах и минутах

Короткий ответ

Создайте Duration и возьмите части через методы to...Part():

void main() {
    Duration duration = Duration.ofSeconds(3909);
 
    String text = "%02d:%02d:%02d".formatted(
            duration.toHours(), duration.toMinutesPart(), duration.toSecondsPart());
    IO.println(text);
}

Результат:

01:05:09

Словами

Пропускайте нулевые части, чтобы получить «2 h 5 min»:

String humanize(Duration d) {
    var parts = new ArrayList<String>();
    if (d.toDays() > 0) parts.add(d.toDays() + " d");
    if (d.toHoursPart() > 0) parts.add(d.toHoursPart() + " h");
    if (d.toMinutesPart() > 0) parts.add(d.toMinutesPart() + " min");
    return parts.isEmpty() ? "less than a minute" : String.join(" ", parts);
}
 
void main() {
    IO.println(humanize(Duration.ofMinutes(125)));
    IO.println(humanize(Duration.ofHours(50)));
    IO.println(humanize(Duration.ofSeconds(20)));
}

Результат:

2 h 5 min
2 d 2 h
less than a minute

Стандартная запись

toString() у Duration выводит формат ISO 8601, а Duration.parse() его читает:

void main() {
    IO.println(Duration.ofMinutes(95));
    IO.println(Duration.parse("PT1H30M").toMinutes());
}

Результат:

PT1H35M
90

Частая ошибка

Использовать toMinutes() вместо toMinutesPart(). Первый возвращает все минуты, а не остаток после часов:

void main() {
    Duration d = Duration.ofMinutes(125);
 
    IO.println(d.toHours() + ":" + d.toMinutes());
    IO.println(d.toHours() + ":" + d.toMinutesPart());
}

Результат:

2:125
2:5

Функции из этого ответа

  • Duration — Промежуток времени в секундах и наносекундах — часы, минуты, секунды.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.