Я хочу записать время, System.currentTimeMillis()
когда пользователь начинает что-то в моей программе. Когда он закончит, я вычту ток System.currentTimeMillis()
из start
переменной, и я хочу показать им, сколько времени прошло, используя читаемый человеком формат, такой как «XX часов, XX минут, XX секунд» или даже «XX минут, XX секунд», потому что его вряд ли займет у кого-то час.
Какой лучший способ сделать это?
Ответы:
Используйте
java.util.concurrent.TimeUnit
класс:Замечания:
TimeUnit
является частью спецификации Java 1.5, ноtoMinutes
было добавлено начиная с Java 1.6.Чтобы добавить начальный ноль для значений 0-9, просто выполните:
Если
TimeUnit
илиtoMinutes
не поддерживается (например, в Android до API версии 9), используйте следующие уравнения:источник
int hours = (int) ((milliseconds / (1000*60*60)) % 24)
это не работает! вместо этого должно быть такint hours = (int) (milliseconds / (1000*60*60)) ;
String.format("%01d:%02d:%02d", hours, minutes, seconds);
Основываясь на ответе @ siddhadev, я написал функцию, которая преобразует миллисекунды в форматированную строку:
источник
1 Days 1 Hours 1 Minutes 1 Seconds
long days = TimeUnit.MILLISECONDS.toDays(millis);
long hours = TimeUnit.MILLISECONDS.toHours(millis) % 24;
long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60;
long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60;
long milliseconds = millis % 1000;
а также метод String.format:return String.format("%d Days %d Hours %d Minutes %d Seconds %d Milliseconds", days, hours, minutes, seconds, milliseconds);
Печать:
источник
Duration dur = new Duration(start, end);
long millis = dur.getMillis();
DateTimeFormat.forPattern("mm:ss:SSS").print(new DateTime(time));
Или конвертируйте Длительность в Период, который может автоматически печататься с использованием JodaPeriodFormatter
. Преобразование может иметь потерю точности, если отличается от хронологии ISO. Предположим, Duration представлен переменнойduration
.Period period = duration.toPeriod().normalizedStandard(PeriodType.time());
PeriodFormat.getDefault().print(period))
Вывод потрясающий: 1 секунда и 581 миллисекунда, отвечая на главный вопрос выше.Хм ... сколько миллисекунд в секунду? А через минуту? Деление не так сложно.
Продолжайте так часами, днями, неделями, месяцами, годом, десятилетиями, чем угодно.
источник
Используя пакет java.time в Java 8:
Вывод в формате ISO 8601 Продолжительность :
PT1M3.553S
(1 минута и 3,553 секунды).источник
Я бы не стал использовать дополнительную зависимость только для этого (в конце концов, деление не так уж сложно), но если вы все равно используете Commons Lang, есть DurationFormatUtils .
Пример использования (адаптировано отсюда ):
Пример:
Примечание . Чтобы получить миллис из двух объектов LocalDateTime, вы можете использовать:
источник
Либо деление рук, либо используйте API SimpleDateFormat .
Редактировать Bombe : в комментариях было показано, что этот подход работает только в течение меньших периодов времени (т. Е. Менее суток).
источник
Просто чтобы добавить больше информации, если вы хотите отформатировать как: ЧЧ: мм: сс
0 <= ЧЧ <= бесконечно
0 <= мм <60
0 <= сс <60
использовать этот:
Я только что имел эту проблему сейчас и понял это
источник
Я думаю, что лучший способ это:
источник
Кратчайшее решение:
Вот, вероятно, самый короткий, который также касается часовых поясов.
Какие выводы, например:
Объяснение:
%tT
время, отформатированное для 24-часовых часов как%tH:%tM:%tS
.%tT
также принимает long в качестве входных данных, поэтому нет необходимости создаватьDate
.printf()
просто напечатает время, указанное в миллисекундах, но в текущем часовом поясе, поэтому мы должны вычесть необработанное смещение текущего часового пояса, так что 0 миллисекунд будут 0 часов, а не значение смещения времени текущего часового пояса.Примечание # 1: Если вам нужен результат как
String
, вы можете получить его , как это:Примечание № 2: Это дает правильный результат, только если
millis
оно меньше дня, потому что часть дня не включена в выходные данные.источник
long millis = 8398;
и когда яString.format("%tT", millis)
передаю это на мой выходной 19:00:08. Откуда 19?TimeZone.getDefault().getRawOffset()
из него точно так, как написано в ответе:String.format("%tT", millis-TimeZone.getDefault().getRawOffset())
Joda времени
Использование Joda-Time :
источник
PeriodFormat
в последней строке. Просто позвоните,Period::toString
чтобы получить строку длительности ISO 8601 по умолчанию.Возвращаясь к вкладу @ brent-nash, мы можем использовать функцию модуля вместо вычитаний и использовать метод String.format для строки результата:
источник
для Android ниже API 9
источник
Для небольших времен, менее часа, я предпочитаю:
для более длинных интервалов:
источник
%tH
только от 0 до 23 часов? Это означает, что, например, 24 часа будут отображаться как00
, 25 часов как01
... те же самые действительные в течение%tT
- дней будут молча отбрасываться. Конечно, могут также отображаться дни, но это будет излишним для той проблемы, которая возникла у меня, когда я писал это (в далеком 2011 году) [:-)Мой простой расчет:
Удачного кодирования :)
источник
Вот ответ, основанный на ответе Брента Нэша, надеюсь, это поможет!
источник
источник
diff=diff-(hours*60*1000);
должно бытьdiff=diff-(hours*60*60*1000);
. Я попытался отредактировать его, но раздражающая политика редактирования StackOverflow говорит, что для редактирования недостаточно символов.Во-первых,
System.currentTimeMillis()
иInstant.now()
не идеальны по срокам. Они оба сообщают время настенных часов, которое компьютер не знает точно, и которое может двигаться хаотично, в том числе возвращаться назад, если, например, демон NTP корректирует системное время. Если ваш тайминг происходит на одной машине, вы должны вместо этого использовать System.nanoTime () .Во-вторых, с Java 8 и выше java.time.Duration - лучший способ представить продолжительность:
источник
Если вы знаете, что разница во времени будет меньше часа, вы можете использовать следующий код:
Это приведет к: 51:00
источник
Этот ответ похож на некоторые ответы выше. Тем не менее, я чувствую, что это было бы полезно, потому что, в отличие от других ответов, это удалит лишние запятые или пробелы и обрабатывает аббревиатуру.
источник
Существует проблема. Когда миллисекунды равны 59999, фактически это 1 минута, но она будет вычислена как 59 секунд, и 999 миллисекунд будут потеряны.
Вот модифицированная версия, основанная на предыдущих ответах, которая может решить эту потерю:
источник
Это проще в Java 9:
Это производит строку как
0 hours, 39 mins, 9 seconds
.Если вы хотите округлить до целых секунд перед форматированием:
Чтобы оставить часы, если они 0:
Теперь мы можем иметь, например,
39 mins, 9 seconds
.Чтобы напечатать минуты и секунды с нулем в начале, чтобы они всегда были двумя цифрами, просто вставьте
02
в соответствующие спецификаторы формата, таким образом:Теперь мы можем иметь, например
0 hours, 39 mins, 09 seconds
.источник
if
-else
там.для правильных строк («1 час, 3 секунды», «3 минуты», но не «0 часов, 0 минут, 3 секунды») я пишу этот код:
источник
Я изменил ответ @MyKuLLSKI и добавил поддержку плюрилизации. Я взял секунды, потому что они мне не нужны, хотя можете смело добавлять их заново, если они вам нужны.
источник
int intervalMins
vslong millis
Я рассмотрел это в другом ответе, но вы можете сделать:
Вывод примерно такой
Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}
, с заказанными единицами.Вам решать, как интернационализировать эти данные в соответствии с целевым языковым стандартом.
источник
Используйте java.util.concurrent.TimeUnit и используйте этот простой метод:
Например:
источник
DurationFormatUtils.formatDurationHMS (длинный)
источник