301 votos

¿Cómo convertir milisegundos en "X minutos, x segundos" en Java?

Quiero registrar el tiempo usando System.currentTimeMillis() cuando un usuario comienza algo en mi programa. Cuando termine, restaré el System.currentTimeMillis() de la start y quiero mostrarles el tiempo transcurrido utilizando un formato legible como "XX horas, XX minutos, XX segundos" o incluso "XX minutos, XX segundos" porque no es probable que alguien tarde una hora.

¿Cuál es la mejor manera de hacerlo?

726voto

siddhadev Puntos 6083

Desde la versión 1.5 existe la clase java.util.concurrent.TimeUnit, utilízala así:

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

Para las versiones de Java inferiores a la 1.5 o para los sistemas que no soportan completamente el TimeUnit (como Android antes de la versión 9 de la API), se pueden utilizar las siguientes ecuaciones:

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

//etc...

61voto

Brent Nash Puntos 6337

Basado en la respuesta de @siddhadev, escribí una función para hacer esto recientemente. Sólo pensé en compartirla en caso de que alguien la encuentre útil:

   /**
     * Convert a millisecond duration to a string format
     * 
     * @param millis A duration to convert to a string form
     * @return A string of the form "X Days Y Hours Z Minutes A Seconds".
     */
    public static String getDurationBreakdown(long millis)
    {
        if(millis < 0)
        {
            throw new IllegalArgumentException("Duration must be greater than zero!");
        }

        long days = TimeUnit.MILLISECONDS.toDays(millis);
        millis -= TimeUnit.DAYS.toMillis(days);
        long hours = TimeUnit.MILLISECONDS.toHours(millis);
        millis -= TimeUnit.HOURS.toMillis(hours);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
        millis -= TimeUnit.MINUTES.toMillis(minutes);
        long seconds = TimeUnit.MILLISECONDS.toSeconds(millis);

        StringBuilder sb = new StringBuilder(64);
        sb.append(days);
        sb.append(" Days ");
        sb.append(hours);
        sb.append(" Hours ");
        sb.append(minutes);
        sb.append(" Minutes ");
        sb.append(seconds);
        sb.append(" Seconds");

        return(sb.toString());
    }

Que lo disfrutes.

23voto

Bombe Puntos 34185

Uhm... ¿cuántos milisegundos hay en un segundo? ¿Y en un minuto? La división no es tan difícil.

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

Continúa así durante horas, días, semanas, meses, años, décadas, lo que sea.

19voto

cadrian Puntos 4102

O bien las divisiones manuales, o bien utilizar el API de SimpleDateFormat .

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

Editar por Bomba : Se ha demostrado en los comentarios que este enfoque sólo funciona para duraciones pequeñas (es decir, menos de un día).

18voto

Thilo Puntos 108673

Yo no tiraría de la dependencia adicional sólo para eso (la división no es tan difícil, después de todo), pero si usted está usando Commons Lang de todos modos, hay el DurationFormatUtils .

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X