Вопрос-ответ

How to format a duration in java? (e.g format H:MM:SS)

Как отформатировать длительность в Java? (например, формат H: MM: SS)

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

Переведено автоматически
Ответ 1

Если вы не хотите перетаскивать библиотеки, это достаточно просто сделать самостоятельно, используя форматировщик или соответствующий ярлык, например. задается целое количество секунд в секунду.:

  String.format("%d:%02d:%02d", s / 3600, (s % 3600) / 60, (s % 60));
Ответ 2

Я использую DurationFormatUtils от Apache common вот так:

DurationFormatUtils.formatDuration(millis, "**H:mm:ss**", true);
Ответ 3

Если вы используете версию Java до 8... вы можете использовать время Joda и PeriodFormatter. Если у вас действительно есть продолжительность (т. Е. Прошедшее количество времени без привязки к календарной системе), то вам, вероятно, следует использовать Duration по большей части - затем вы можете вызвать toPeriod (указав все, что PeriodType вы хотите, чтобы отразить, становится ли 25 часов 1 днем и 1 часом или нет, и т.д.), Чтобы получить Period который вы можете отформатировать.

Если вы используете Java 8 или более позднюю версию: обычно я бы предложил использовать java.time.Duration для представления продолжительности. Затем вы можете вызвать getSeconds() или подобное, чтобы получить целое число для стандартного форматирования строки в соответствии с ответом bobince, если вам нужно - хотя вам следует быть осторожным в ситуации, когда длительность отрицательна, поскольку вы, вероятно, хотите, чтобы в выходной строке был единственный знак отрицания. Итак, что-то вроде:

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;
}

Форматирование таким способом разумно просто, хотя и раздражающе вручную. Для синтаксического анализа это становится более сложным делом в целом... Вы все равно можете использовать Joda Time даже с Java 8, если, конечно, захотите.

Ответ 4

Это стало проще с Java 9. A Duration по-прежнему не поддается форматированию, но добавлены методы получения часов, минут и секунд, что несколько упрощает задачу:

    LocalDateTime start = LocalDateTime.of(2019, Month.JANUARY, 17, 15, 24, 12);
LocalDateTime end = LocalDateTime.of(2019, Month.JANUARY, 18, 15, 43, 33);
Duration diff = Duration.between(start, end);
String hms = String.format("%d:%02d:%02d",
diff.toHours(),
diff.toMinutesPart(),
diff.toSecondsPart());
System.out.println(hms);

Вывод этого фрагмента выглядит следующим образом:


24:19:21


java