Как преобразовать миллисекунды в & ldquo; X минут, x секунд & rdquo; в Java?

localhost:8080/esccapp/tst/submit.jsp?key=datr&key2=datr2&key3=datr3

    <%@page import="java.util.Enumeration"%>

    <%
    Enumeration in = request.getParameterNames();
    while(in.hasMoreElements()) {
     String paramName = in.nextElement().toString();
     out.println(paramName + " = " + request.getParameter(paramName)+"<br>");
    }
    %>

    key = datr
    key2 = datr2
    key3 = datr3
540
задан Click Upvote 9 March 2009 в 08:41
поделиться

5 ответов

Используйте java.util.concurrent.TimeUnit класс:

String.format("%d min, %d sec", 
    TimeUnit.MILLISECONDS.toMinutes(millis),
    TimeUnit.MILLISECONDS.toSeconds(millis) - 
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);

Примечание: TimeUnit часть спецификации Java 1.5, но toMinutes был добавлен с Java 1.6.

Для добавления начального нуля для значений 0-9 просто сделайте:

String.format("%02d min, %02d sec", 
    TimeUnit.MILLISECONDS.toMinutes(millis),
    TimeUnit.MILLISECONDS.toSeconds(millis) - 
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);

, Если TimeUnit или toMinutes не поддерживаются (такой как на Android перед версией 9 API), используйте следующие уравнения:

int seconds = (int) (milliseconds / 1000) % 60 ;
int minutes = (int) ((milliseconds / (1000*60)) % 60);
int hours   = (int) ((milliseconds / (1000*60*60)) % 24);
//etc...
1163
ответ дан Dave Jarvis 9 March 2009 в 18:41
поделиться

Я не вытянул бы в дополнительной зависимости только для того (подразделение не то, что трудно, в конце концов), но если Вы используете палату общин Lang так или иначе, существует DurationFormatUtils.

Использование В качестве примера (адаптированный от здесь ):

import org.apache.commons.lang3.time.DurationFormatUtils

public String getAge(long value) {
    long currentTime = System.currentTimeMillis();
    long age = currentTime - value;
    String ageString = DurationFormatUtils.formatDuration(age, "d") + "d";
    if ("0d".equals(ageString)) {
        ageString = DurationFormatUtils.formatDuration(age, "H") + "h";
        if ("0h".equals(ageString)) {
            ageString = DurationFormatUtils.formatDuration(age, "m") + "m";
            if ("0m".equals(ageString)) {
                ageString = DurationFormatUtils.formatDuration(age, "s") + "s";
                if ("0s".equals(ageString)) {
                    ageString = age + "ms";
                }
            }
        }
    }
    return ageString;
}   

Пример:

long lastTime = System.currentTimeMillis() - 2000;
System.out.println("Elapsed time: " + getAge(lastTime)); 

//Output: 2s

Примечание : получить millis от двух LocalDateTime возражает, что можно использовать:

long age = ChronoUnit.MILLIS.between(initTime, LocalDateTime.now())
27
ответ дан lepe 9 March 2009 в 18:41
поделиться
  • 1
    Спасибо за Ваш ответ. Но, isn' t проблема здесь с " mymath.h" и включая его дважды в " основной cpp" так как мы имеем два, включает в " добавьте h" и " вычтите h"? – Simplicity 22 January 2011 в 09:50

Uhm..., сколько миллисекунд находится через секунду? И за минуту? Подразделение не это трудно.

int seconds = (int) ((milliseconds / 1000) % 60);
int minutes = (int) ((milliseconds / 1000) / 60);

Продолжаются как этот в течение многих часов, дней, недель, месяцев, года, десятилетий, безотносительно.

34
ответ дан Bombe 9 March 2009 в 18:41
поделиться
  • 1
    Где делают Вы подразумеваете под " в there"? Вы имеете в виду mymath.h? – Simplicity 22 January 2011 в 17:09

Или вручите подразделения или используйте SimpleDateFormat API.

long start = System.currentTimeMillis();
// do your work...
long elapsed = System.currentTimeMillis() - start;
DateFormat df = new SimpleDateFormat("HH 'hours', mm 'mins,' ss 'seconds'");
df.setTimeZone(TimeZone.getTimeZone("GMT+0"));
System.out.println(df.format(new Date(elapsed)));

Редактирование Мороженое : Это показали в комментариях, что этот подход только работает на меньшие продолжительности (т.е. меньше чем день).

25
ответ дан Community 9 March 2009 в 18:41
поделиться
  • 1
    @SWEngineer: Вы don' t; включать защита заставляет каждый включать заголовка после первого, ничего не сделайте. – Fred Nurk 22 January 2011 в 21:32

Во-первых, Вы не должны использовать System.currentTimeMillis() или Instant.now() для синхронизации. Они оба сообщают о тактовом стеной времени, которое компьютер не знает точно, и которое может переместиться беспорядочно, включая движение назад , если, например, демон NTP исправляет системное время. Вместо этого используйте System.nanoTime () .

, Во-вторых, от Java 8 вперед java.time. Продолжительность является лучшим способом представить продолжительность:

long start = System.nanoTime();
// do things...
long end = System.nanoTime();
Duration duration = Duration.ofNanos(end - start);
System.out.println(duration); // Prints "PT18M19.511627776S"
System.out.printf("%d Hours %d Minutes %d Seconds%n",
        duration.toHours(), duration.toMinutes() % 60, duration.getSeconds() % 60);
// prints "0 Hours 18 Minutes 19 Seconds"
1
ответ дан MikeFHay 17 September 2019 в 06:15
поделиться
  • 1
    Специфически локальные внутренние классы. – Tom Hawtin - tackline 19 April 2010 в 21:00
Другие вопросы по тегам:

Похожие вопросы: