2011-11-13 18 views
7

Estoy tratando de obtener un doble valor con segundos para convertir a un formato de hora personalizado. He intentado formato SimpleDate, pero eso no funciona ...Tiempo en segundos para el formato de cadena personalizada

Tengo un doble valor en este formato: 407.33386569554585 (que representa 407 segundos y 333 milisegundos ...).

Necesito que en este formato: HH/MM/SS.MS

¿Cómo iba a hacer eso?

¡Gracias de antemano!

+0

¿Cómo obtener el valor en esa variable doble? ¿Y cómo se construye el doble valor? No puedo ver ningún segundo allí :) – saintedlama

+0

De acuerdo, ¿qué representa ese doble? – Lucas

+0

Puede obtener algunas ideas aquí: http://stackoverflow.com/questions/266825/how-to-format-a-duration-in-java-eg-format-hmmss –

Respuesta

12

Multiplique por 1,000 y luego cree un long y cree una fecha con él.

Date date = new Date((long)(dubTime*1000)); 

Desde aquí, puede utilizar un SimpleDateFormat para hacer la cadena que desee.

String formattedDate = new SimpleDateFormat("HH/mm/ss.SSS").format(date); 
+2

Sigue añadiendo 9 horas y 30 minutos en ... curiosamente esa es mi zona horaria +9: 30 ... – Diesal11

+0

¿Cómo la elimino? – Diesal11

+0

Suena como si quisieras configurar 'Locale' de' Date' o cambiar 'Locale' después de la construcción. No es seguro. Básicamente, el "largo" que está pasando se interpretará como los milisegundos que han transcurrido desde el 1 de enero de 1970 GMT. Si el valor "doble" del tiempo que tiene no es un recuento de segundos desde esa época, tendrá que realizar transformaciones adicionales para que así sea. –

2

Aquí hay un código que usamos y que usted puede adaptar fácilmente. La aplicación a continuación le imprime un valor tan 00days 00h00m00s00ms:

public final static long ONE_MILLISECOND = 1; 
public final static long MILLISECONDS_IN_A_SECOND = 1000; 

public final static long ONE_SECOND = 1000; 
public final static long SECONDS_IN_A_MINUTE = 60; 

public final static long ONE_MINUTE = ONE_SECOND * 60; 
public final static long MINUTES_IN_AN_HOUR = 60; 

public final static long ONE_HOUR = ONE_MINUTE * 60; 
public final static long HOURS_IN_A_DAY = 24; 
public final static long ONE_DAY = ONE_HOUR * 24; 
public final static long DAYS_IN_A_YEAR = 365; 

public String formatHMSM(Number n) { 


    String res = ""; 
    if (n != null) { 
     long duration = n.longValue(); 

     duration /= ONE_MILLISECOND; 
     int milliseconds = (int) (duration % MILLISECONDS_IN_A_SECOND); 
     duration /= ONE_SECOND; 
     int seconds = (int) (duration % SECONDS_IN_A_MINUTE); 
     duration /= SECONDS_IN_A_MINUTE; 
     int minutes = (int) (duration % MINUTES_IN_AN_HOUR); 
     duration /= MINUTES_IN_AN_HOUR; 
     int hours = (int) (duration % HOURS_IN_A_DAY); 
     duration /= HOURS_IN_A_DAY; 
     int days = (int) (duration % DAYS_IN_A_YEAR); 
     duration /= DAYS_IN_A_YEAR; 
     int years = (int) (duration); 
     if (days == 0) { 
      res = String.format("%02dh%02dm%02ds%03dms", hours, minutes, seconds, milliseconds); 
     } else if (years == 0) { 
      res = String.format("%ddays %02dh%02dm%02ds%03dms", days, hours, minutes, seconds, milliseconds); 
     } else { 
      res = String.format("%dyrs %ddays %02dh%02dm%02ds", years, days, hours, minutes, seconds); 
     } 
    } 
    return res; 

} 
1

Sólo para añadir a la respuesta de Tim: para obtener la cadena correcta, independientemente de su zona horaria, sólo tiene que utilizar SimpleDateFormat.setTimeZone():

DateFormat dateFormat = new SimpleDateFormat("HH/mm/ss.SSS"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 
// ... 
double doubleTime=1000.0; 
Date date = new Date((long) (doubleTime*1000)); 
String formattedTime = dateFormat.format(date); 

Y asegúrese de consultar DateFormat.setTimeZone javadoc para saber cuándo puede sobrescribirse el timeZone.

3

Y en 8 estilo de Java (si desea recibir ningún aviso de desaprobación Fecha):

DateTimeFormatter formatter = 
    DateTimeFormatter.ofPattern("HH/mm/ss.SSS").withZone(ZoneId.of("UTC")); 
Instant instant = Instant.ofEpochMilli((long)(dubTime*1000)); 
return formatter.format(instant); 
+0

La fecha no está en desuso (todavía). – assylias

+0

Sí, el informe de la muerte de Date fue una exageración. :-) –

Cuestiones relacionadas