2012-02-09 62 views
22

Quiero convertir los segundos/milisegundos en este formato "HH: mm: ss" (para las muestras, de 5 segundos a 00:00:05) . He intentado conseguir ese formato de esta manera:Cómo convertir los segundos en este formato "HH: mm: ss"

int millis = 5000; 
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); 
String time = df.format(millis); 

De esa manera, consigo "01:00:05" y no "00:00:05". ¿Dónde estoy equivocado?

+0

posible duplicado de [¿Cómo convertir milisegundos a "X minutos, x segundos" en Java?] (Http://stackoverflow.com/questions/625433/how-to-convert-milliseconds-to-x-mins-x- seconds-in-java) –

+1

Esta pregunta tiene mejores respuestas [aquí] (http://stackoverflow.com/a/625624/685806) y [aquí] (http://stackoverflow.com/a/266970/685806). – Pino

+0

posible duplicado de [Cómo convertir el tiempo en segundos a HH: formato MM: SS en MySQL?] (Http://stackoverflow.com/questions/18911455/how-to-convert-time-in-seconds-to-hhmmss -format-in-mysql) –

Respuesta

16

Timezones.

El valor largo 5000 significa 5 segundos después de la época. Para la mayoría de las zonas horarias, 5 segundos después de la época no son 5 segundos después de la medianoche, hora local.

Java 8 actualización:

java.time.LocalTime se encargará de la idea de un reloj de pared "hora del día", sin tener que preocuparse acerca de las zonas horarias y días implícitos en java.util.Date. Si puede usar Java 8, y sus duraciones siempre será menos de un día, a continuación, una versión correcta de su ejemplo puede ser tan simple como:

int millis = 5000; 
int seconds = millis/1000; // Maybe no need to divide if the input is in seconds 
LocalTime timeOfDay = LocalTime.ofSecondOfDay(seconds); 
String time = timeOfDay.toString(); 

(supongo que en sentido estricto, java.time.Duration es un modelo mejor de lo que desea, ya que representa una cierta cantidad de segundos, en lugar de una hora del día. Pero es un dolor formatear en hh: mm: ss, por lo que si siempre se trata de valores inferiores a 24 horas , TimeOfDay le da este formato de forma gratuita y es por lo demás equivalentes.)


Si está atrapado con Java 7 o menos, luego, especificar explícitamente una zona horaria de GMT en su código de ejemplo debería darle el resultado que espera.

Aquí hay una sesión Scala REPL demostrar el problema, y ​​la solución de Java 7, en mi máquina:

scala> val millis = 5000 
millis: Int = 5000 

scala> val df = new java.text.SimpleDateFormat("HH:mm:ss") 
df: java.text.SimpleDateFormat = [email protected] 

scala> df.format(millis) 
res0: java.lang.String = 01:00:05 

scala> df.getTimeZone.getID 
res1: java.lang.String = GB 

scala> df.getTimeZone.getOffset(millis) 
res2: Int = 3600000 

scala> df.setTimeZone(java.util.TimeZone.getTimeZone("GMT")) 

scala> df.format(millis) 
res3: java.lang.String = 00:00:05 

Así se puede ver que mi zona horaria predeterminada es GB, que tiene un desplazamiento con respecto a GMT a 1 hora el tiempo indicado por 5000L. Al establecer la zona horaria en GMT, se obtiene el resultado esperado de 00:00:05.

+1

¿Estás seguro de que esto está relacionado con la zona horaria? Estoy en la zona horaria GMT, y al llamar a 'df.getTimeZone()' en el código anterior, devuelvo 'id =" Europe/London "' y obtengo el mismo resultado de "01:00:05". –

+0

Sí, Londres era 1 hora antes de GMT en el momento en cuestión (según Java al menos). Ver mi edición para un ejemplo trabajado. –

+0

Es trabajos. Agregué este 'df.setTimeZone (TimeZone.getTimeZone (" GMT "));' – Webman

12

Tengo esto para trabajar. Avíseme si funciona para usted. Parece como un montón de líneas que hacer algo aparentemente simple ..

int millis = 5000; 
    TimeZone tz = TimeZone.getTimeZone("UTC"); 
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); 
    df.setTimeZone(tz); 
    String time = df.format(new Date(millis)); 
    System.out.println(time); 
+0

esto funcionó para mí también. si alguien encuentra una mejor manera, por favor avíseme. p.s es bueno saber que java todavía carece de funcionalidad simple de fecha y hora. – APT

+1

@APT: puede que le entristezca saber que Java 8 tiene una funcionalidad de fecha/hora mucho mejor (!). He actualizado mi respuesta con un ejemplo utilizando el nuevo paquete 'java.time'. –

+0

Gracias, parece ser mejor en Java 8 :) – APT

1
public class HHMMSS { 

     final int UUR = 3600; 
     final int MINUUT = 60; 

    public void converteerTijd() { 

     int uren, minuten, seconden, ingave; 
     System.out.print("Geef een aantal seconden: "); 
     ingave = Input.readInt(); 
     uren = ingave/UUR; 
     minuten = (ingave - uren * UUR)/MINUUT; 
     seconden = ingave - uren * UUR - minuten * MINUUT; 
     String nU1 = (uren < 10) ? "0" : ""; 
     String nM1 = (minuten < 10) ? "0" : ""; 
     String nS1 = (seconden < 10) ? "0" : ""; 
     System.out.println(nU1 + uren + "-" + nM1 + minuten + "-" + nS1 + seconden); 
+0

Ponga una breve descripción del tipo de problema al que se enfrenta. – Abs

+0

No es la respuesta más acertada ... pero funciona muy bien. –

+0

Usando String.format, esto podría hacerse mucho mejor, similar a [Respuesta de Oles] (https://stackoverflow.com/a/43368279/6723250), incluso sin Java 9 – Xerus

5

Debe obtener SimpleDateFormat con el argumento de configuración regional.

public static String getDateFromMillis(long millis) { 
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); 
    return formatter.format(new Date(millis)); 
} 
+0

¡Agradable! Gracias. – t0m

+1

No necesita crear una nueva fecha cada vez. formatter.format (millis); también funcionará –

1

Java 9 respuesta:

Duration dur = Duration.ofMillis(millis); 
    System.out.println(String.format("%02d:%02d:%02d", 
         dur.toHours(), dur.toMinutesPart(), dur.toSecondsPart())); 

(no determinado todavía)

Los toXxPart métodos se describen en the API docs for Java 9.

0

escribí una función de utilidad simple para esta tarea que no requiere ninguna versión de Java ni crea instancias de objetos innecesarios:

/** 
* provides a String representation of the given time 
* @return {@code millis} in hh:mm:ss format 
*/ 
public static final String formatTime(long millis) { 
    long secs = millis/1000; 
    return String.format("%02d:%02d:%02d", (secs % 86400)/3600, (secs % 3600)/60, secs % 60); 
} 

A diferencia de otras soluciones aquí, esto puede incluso hacer frente a un máximo de 100 horas

Cuestiones relacionadas