Convierta la marca de tiempo en milisegundos a tiempo con formato de cadena en Java

Resuelto Cratylus asked hace 14 años • 10 respuestas

Estoy intentando convertir un valor largo ( número de milisegundos transcurridos desde el 1/1/1970, es decir, Época ) a la hora del formato h:m:s:ms.

El valor largo que uso como marca de tiempo lo obtengo del campo timestampde un evento de registro de log4j.

Hasta ahora he probado lo siguiente y falla:

logEvent.timeStamp/ (1000*60*60)
TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

pero me sale un valor incorrecto:

1289375173771 for logEvent.timeStamp
358159  for logEvent.timeStamp/ (1000*60*60) 
21489586 for TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

¿Cómo hago esto?

Cratylus avatar Nov 10 '10 14:11 Cratylus
Aceptado

Prueba esto:

Date date = new Date(logEvent.timeSTamp);
DateFormat formatter = new SimpleDateFormat("HH:mm:ss.SSS");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String dateFormatted = formatter.format(date);

Consulte SimpleDateFormat para obtener una descripción de otras cadenas de formato que acepta la clase.

Vea un ejemplo ejecutable usando una entrada de 1200 ms.

manolowar avatar Nov 10 '2010 08:11 manolowar
long millis = durationInMillis % 1000;
long second = (durationInMillis / 1000) % 60;
long minute = (durationInMillis / (1000 * 60)) % 60;
long hour = (durationInMillis / (1000 * 60 * 60)) % 24;

String time = String.format("%02d:%02d:%02d.%d", hour, minute, second, millis);
Brajendra Pandey avatar May 13 '2013 11:05 Brajendra Pandey

Le mostraré tres formas de (a) obtener el campo de minutos a partir de un valor largo y (b) imprimirlo usando el formato de fecha que desee. Uno usa java.util.Calendar , otro usa Joda-Time y el último usa el marco java.time integrado en Java 8 y posteriores.

El marco java.time reemplaza las antiguas clases de fecha y hora empaquetadas y está inspirado en Joda-Time, definido por JSR 310 y ampliado por el proyecto ThreeTen-Extra.

El marco java.time es el camino a seguir cuando se utiliza Java 8 y versiones posteriores. De lo contrario, como en Android, utilice Joda-Time. Las clases java.util.Date/.Calendar son notoriamente problemáticas y deben evitarse.

java.util.Fecha y .Calendario

final long timestamp = new Date().getTime();

// with java.util.Date/Calendar api
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timestamp);
// here's how to get the minutes
final int minutes = cal.get(Calendar.MINUTE);
// and here's how to get the String representation
final String timeString =
    new SimpleDateFormat("HH:mm:ss:SSS").format(cal.getTime());
System.out.println(minutes);
System.out.println(timeString);

Tiempo Joda

// with JodaTime 2.4
final DateTime dt = new DateTime(timestamp);
// here's how to get the minutes
final int minutes2 = dt.getMinuteOfHour();
// and here's how to get the String representation
final String timeString2 = dt.toString("HH:mm:ss:SSS");
System.out.println(minutes2);
System.out.println(timeString2);

Producción:

24
09:24:10:254
24
09:24:10:254

java.tiempo

long millisecondsSinceEpoch = 1289375173771L;
Instant instant = Instant.ofEpochMilli ( millisecondsSinceEpoch );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , ZoneOffset.UTC );

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "HH:mm:ss:SSS" );
String output = formatter.format ( zdt );

System.out.println ( "millisecondsSinceEpoch: " + millisecondsSinceEpoch + " instant: " + instant + " output: " + output );

milisegundosSinceEpoch: 1289375173771 instante: 2010-11-10T07:46:13.771Z salida: 07:46:13:771

Sean Patrick Floyd avatar Nov 10 '2010 08:11 Sean Patrick Floyd

Es posible utilizar Apache Commons (commons-lang3) y su clase DurationFormatUtils.

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.1</version>
</dependency>

Por ejemplo:

String formattedDuration = DurationFormatUtils.formatDurationHMS(12313152);
// formattedDuration value is "3:25:13.152"
String otherFormattedDuration = DurationFormatUtils.formatDuration(12313152, DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN);
// otherFormattedDuration value is "P0000Y0M0DT3H25M13.152S"

Espero que pueda ayudar...

YoCha avatar Feb 27 '2014 14:02 YoCha