Я запутался. Наткнувшись на эту ветку, я попытался выяснить, как отформатировать таймер обратного отсчета, который имел формат hh:mm:ss
.
Вот моя попытка -
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
Поэтому, когда я пытаюсь получить значение вроде 3600000ms
, я получаю 01:59:00
, что неправильно, так как должно быть 01:00:00
. Очевидно, что с моей логикой что-то не так, но сейчас я не вижу, что это!
Кто-нибудь может помочь?
Редактировать -
Починил это. Вот правильный способ форматировать миллисекунды для hh:mm:ss
форматирования -
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
Проблема была в этом TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
. Так и должно было быть TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
.
00:59:59
, так и должно быть01:00:00
.Ответы:
Вы были очень близки
Вы переводили часы в миллисекунды, используя минуты вместо часов .
Кстати, мне нравится ваше использование
TimeUnit
API :)Вот некоторый тестовый код:
Вывод:
Я понял, что мой код выше можно значительно упростить, используя деление по модулю вместо вычитания:
Все еще использует
TimeUnit
API для всех магических значений и дает точно такой же результат.источник
.replaceAll("^00:", "")
или.replaceAll("^00:(00:)?", "")
удалить минуты, а также часы, если оба равны нулю."15:00"
и"10:00:23"
соответственно; только ведущие нули удаляются, в результате сравнения будет якорем , чтобы начать с вводом^
.Общий метод для этого довольно прост:
источник
String.format("%
02d:%02d:%02d", h,m,s)
?Если вы используете Apache Commons:
источник
DurationFormatUtils.formatDurationHMS(timeInMS);
Я использовал это:
Смотрите описание класса Formatter .
См. Работающий пример с использованием ввода 2400 мс.
источник
String.format()
это временная зона зависит . Однако идеальный правильный ответ должен быть независимым от часового пояса .String.format()
это временная зона зависит . Однако идеальный правильный ответ должен быть независимым от часового пояса .Смотрите исполняемый пример с использованием ввода 1200 мс.
источник
источник
Результаты испытаний для 4 реализаций
Потребовалось много форматирования для больших данных, нужна лучшая производительность, поэтому вот (неожиданные) результаты:
для (int i = 0; i <1000000; i ++) {FUNCTION_CALL}
Продолжительности:
formatTimeUnit: 2216 миллис
источник
StringBuilder
затем сделать ошибку, используя «0» + номер типа «разрушает» его. ГК @mre JVM чрезвычайно хорош в распределении и сборе большого количества недолговечных объектов, здесь нет проблем. Я пошелString.format
без логики «ведущий-ноль».это сработало для меня, с Kotlin
источник
Если следовать ответу Богемяна, нам не нужно использовать TimeUnit, чтобы найти известное значение. Гораздо более оптимальный код будет
Надеюсь, поможет
источник
millisLeft%1000/10
чтобы мы получили форматhour:minutes:seconds:milliseconds
millisLeft%1000
источник
Java 9
Это печатает:
Вы делаете все правильно, позволяя библиотечным методам выполнять преобразования, которые для вас необходимы.
java.time
современный API даты и времени Java, или, точнее, егоDuration
класс делает это более элегантно и менее подверженным ошибкам, чемTimeUnit
.В
toMinutesPart
иtoSecondsPart
методы , которые я использовал , были введены в Java 9.Ява 6, 7 и 8
Выход такой же, как указано выше.
Вопрос: Как это может работать в Java 6 и 7?
java.time
поставляется встроенным.org.threeten.bp
подпакетов.связи
java.time
.java.time
был впервые описан.java.time
в Java 6 и 7 (ThreeTen для JSR-310).источник
Код ниже выполняет преобразование в обе стороны
23: 59: 58: 999 - 86398999
и тогда
С 86398999 по 23: 59: 58: 999
источник
Формат: 00: 00: 00.000
Пример: 615605 миллисекунд
00: 10: 15,605
источник
Ответ, помеченный как правильный, содержит небольшую ошибку,
например, это пример значения, которое я получаю:
Это решение, чтобы получить правильный формат:
получая в результате правильный формат:
Другой вариант получить формат
hh:mm:ss
просто:источник
Я попытался, как показано в первом ответе. Это работает, но минус привел меня в замешательство. Мой ответ от Groovy:
источник
Для Котлина
где,
milSecs
миллисекундыисточник
Ну, вы можете попробовать что-то вроде этого:
преобразовать миллисекунды в значение времени
источник