Преобразовать чч: мм: сс в ммм: сс

У меня есть функция Java, которая преобразует секунды в определенный формат (чч: мм: сс):

public static String formatChronometer(long seconds) {
    return String.format("%02d:%02d:%02d", TimeUnit.SECONDS.toHours(seconds),
            TimeUnit.SECONDS.toMinutes(seconds) % TimeUnit.HOURS.toMinutes(1),
            TimeUnit.SECONDS.toSeconds(seconds) % TimeUnit.MINUTES.toSeconds(1));
}

Мой клиент хочет показывать этот хронометр без "часовых" меток. Пример:

  1. если 100 hours => 6000:00
  2. если 0 hours and 50 minutes => 50:00
  3. если 1 hour and 12 minutes and 30 seconds => 72:30
  4. если 10 hours and 5 minutes => 600:05
  5. если 0 hours, 0 minutes and 0 seconds => 00:00

Как я должен изменить свой метод?

4 ответа

Решение

Для гибкого номера минут вы должны использовать %d вместо %02d которые указывают, сколько цифр вы хотите, ваше решение должно выглядеть следующим образом:

return String.format("%d:%02d",
        TimeUnit.SECONDS.toMinutes(seconds),
        TimeUnit.SECONDS.toSeconds(seconds) % TimeUnit.MINUTES.toSeconds(1)
);

пример

long[] times = {360000, 3000, 4350, 36300, 0};
for (long time : times) {
    String result = String.format("%d:%02d",
            TimeUnit.SECONDS.toMinutes(time),
            TimeUnit.SECONDS.toSeconds(time) % TimeUnit.MINUTES.toSeconds(1));
    System.out.println(String.format("%d : %s", time, result));
}

Выходы

360000 : 6000:00
3000   : 50:00
4350   : 72:30
36300  : 605:00
0      : 0:00

Просто угробите часы.

return String.format("%04d:%02d",
    TimeUnit.SECONDS.toMinutes(seconds),
    TimeUnit.SECONDS.toSeconds(seconds) % TimeUnit.MINUTES.toSeconds(1));
public static String formatChronometer(long seconds) {
    Duration dur = Duration.ofSeconds(seconds);
    return String.format("%02d:%02d", dur.toMinutes(), dur.toSecondsPart());
}

Когда я кормила 36005 в этот метод, он вернулся 600:05,

Я полагаю, что ваши секунды хронометра обозначают продолжительность, количество времени. Либо истекшее время, либо значение для обратного отсчета. Не время суток (вы упомянули 100 часов в качестве примера, но время дня никогда не бывает 100 часов). В этом случае я бы четко использовал Duration класс для его моделирования. Это самая правильная вещь. Некоторые используют слово самодокументирующееся о коде, написанном с таким вниманием.

Duration.toSecondsPart Метод был введен только в Java 9. Если вы используете Java 8 (или Java 6 или 7 с ThreeTen Backport), получите часть секунд, вычитая минуты и затем конвертируя в секунды:

    long minutes = dur.toMinutes();
    dur = dur.minusMinutes(minutes);
    return String.format("%02d:%02d", minutes, dur.toSeconds());

Тогда результат тот же.

PS Если ваши секунды обозначают время суток вместо этого, правильным и самодокументированным решением будет использование LocalTime учебный класс:

    LocalTime chrono = LocalTime.ofSecondOfDay(seconds);
    return String.format("%02d:%02d",
            chrono.get(ChronoField.MINUTE_OF_DAY), chrono.getSecond());

Это отклонит значения секунд больше чем 86399 за исключением того, что время суток не может быть 24:00 или больше

Удалить свой hours из форматирования

public static String formatChronometer(long seconds) {
    return String.format("%02d:%02d",
            TimeUnit.SECONDS.toMinutes(seconds),
            TimeUnit.SECONDS.toSeconds(seconds) % TimeUnit.MINUTES.toSeconds(1));
}
Другие вопросы по тегам