Как вывести длительность в часах и минутах
Короткий ответ
Создайте 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 — Промежуток времени в секундах и наносекундах — часы, минуты, секунды.