2010-04-24 11 views
14

Estoy familiarizado con la impresión de diferencia de tiempo en milisegundos:¿La forma más idiomática de imprimir una diferencia horaria en Java?

long time = System.currentTimeMillis(); 
//do something that takes some time... 
long completedIn = System.currentTimeMillis() - time; 

Pero, ¿hay una buena manera de imprimir un tiempo completo en un formato especificado (por ejemplo: HH: MM: SS), ya sea usando Apache Commons o incluso los temidos objetos de Fecha/Hora de la API de la plataforma? En otras palabras, ¿cuál es la forma más corta, simple y sin sentido de escribir un formato de tiempo derivado de milisegundos en Java?

+3

Debe ser 'System.currentTimeMillis() - time;'. –

Respuesta

20

Apache Commons tiene la clase DurationFormatUtils para aplicar un formato específico a una duración de tiempo. Por lo tanto, algo así como:

long time = System.currentTimeMillis(); 
//do something that takes some time... 
long completedIn = System.currentTimeMillis() - time; 

DurationFormatUtils.formatDuration(completedIn, "HH:mm:ss:SS"); 
+0

Incluso puede alinear eso con: DurationFormatUtils.formatDuration (System.currentTimeMillis() - time, "HH: mm: ss: SS"); – Liggy

+5

O utilice el casi idéntico, incorporado DurationFormatUtils.formatDurationHMS (end-start); – JRL

+0

@JRL: 'DurationFormatUtils.formatDurationHMS (end-start);' satisfará el ejemplo dado en la pregunta, pero agregué los milisegundos en mi solución. –

1

Si realmente quiere ver una diferencia de un milisegundo, no creo que haya una manera más corta y simple.

Si necesita una forma más poderosa (pero ciertamente no más simple) de recopilar estadísticas de rendimiento, existe Perf4J.

1

Que yo sepa. Pero printf() puede hacer esto fácilmente si calcula los valores para H, M y S, y usa un patrón de% 02 para cada uno.

4

una biblioteca diseñada para el propósito es el mejor enfoque, pero SimpleDateFormat con la derecha TimeZone puede ser suficiente para los períodos de menos de un día. Períodos más largos requieren tratar el día especialmente. salida

import java.text.DateFormat; 
import java.util.Date; 
import java.text.SimpleDateFormat; 
import java.util.TimeZone; 

public class Elapsed { 

    private static final long MS_DAY = 24 * 60 * 60 * 1000; 
    private final DateFormat df = new SimpleDateFormat("HH : mm : ss : S"); 

    public Elapsed() { 
     df.setTimeZone(TimeZone.getTimeZone("GMT")); 
    } 

    private String format(long elapsed) { 
     long day = elapsed/MS_DAY; 
     StringBuilder sb = new StringBuilder(); 
     sb.append(day); 
     sb.append(" : "); 
     sb.append(df.format(new Date(elapsed))); 
     return sb.toString(); 
    } 

    public static void main(String[] args) { 
     Elapsed e = new Elapsed(); 
     for (long t = 0; t < 3 * MS_DAY; t += MS_DAY/2) { 
      System.out.println(e.format(t)); 
     } 
    } 
} 

Consola:

 
0 : 00 : 00 : 00 : 0 
0 : 12 : 00 : 00 : 0 
1 : 00 : 00 : 00 : 0 
1 : 12 : 00 : 00 : 0 
2 : 00 : 00 : 00 : 0 
2 : 12 : 00 : 00 : 0 
0
long diff = System.currentTimeMillis() - startTime; 
int hours = (int)(diff/3600000); diff -= hours * 3600000; 
int mins = (int)(diff/60000); diff -= mins * 60000; 
int secs = (int)(diff/1000); diff -= secs * 1000; 
System.out.println(String.format("%d:%d:%d.%d", hours, mins, secs, diff)); 
+1

Este formato de salida está roto. –

0

tl; dr

Duration.ofMillis(…) 
     .toString() 

ISO 8601

lo que es el, más simple, no hay manera más corta sin sentido a la IRG te un formato de tiempo derivado de milisegundos

El estándar ISO 8601 define los formatos de texto para los valores de fecha y hora. Estos formatos son cortos, simples y sin sentido. Son en gran medida legibles por humanos en diversas culturas, prácticos y no ambiguos.

Por períodos de tiempo no vinculados a la línea de tiempo, el standard format es PnYnMnDTnHnMnS. El P marca el comienzo y el T separa los años-mes-días de las horas-minutos-segundos. Entonces una hora y media es PT1H30M.

java.time.Duration

Las clases java.time incluyen un par de clases para representar espacios de tiempo. La clase Duration es por horas-minutos-segundos, y Period es por años-meses-días.

Duration d = Duration.ofMillis(yourMillisecondsNumberGoesHere); 

Las clases java.time usan formatos ISO 8601 por defecto para analizar y generar cadenas. Las clases Duration y Period usan este formato estándar particular. Así que simplemente llame al toString.

String output = d.toString(); 

Puede ir en la otra dirección, analizando estas cadenas estándar.

Duration d = Duration.parse("PT1H30M"); 

Sobre java.time

El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora legacy, como java.util.Date, Calendar, & SimpleDateFormat.

El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.

Para obtener más información, consulte el Oracle Tutorial. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

¿Dónde obtener las clases java.time?

  • Java SE 8 y SE 9 y más tarde
    • incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
  • Android

El proyecto se extiende ThreeTen-Extra java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter y more.

Cuestiones relacionadas