Estoy confundido. Después de tropezar con este hilo, traté de descubrir cómo formatear un temporizador de cuenta regresiva que tenía el formato hh:mm:ss.
Aquí está mi intento:
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
Entonces, cuando intento un valor como 3600000ms, obtengo 01:59:00, lo que está mal, ya que debería ser 01:00:00. Obviamente hay algo mal con mi lógica, pero por el momento, ¡no puedo ver qué es!
¿Alguien puede ayudar?
Editar -
Arreglado. Aquí está la forma correcta de formatear milisegundos para hh:mm:ssformatear:
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
El problema fue este TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)). Debería haber sido esto TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))en su lugar.

00:59:59, debería ser01:00:00.Respuestas:
Estabas muy cerca:
Estaba convirtiendo horas a milisegundos usando minutos en lugar de horas .
Por cierto, me gusta tu uso de la
TimeUnitAPI :)Aquí hay un código de prueba:
Salida:
Me di cuenta de que mi código anterior se puede simplificar enormemente usando una división de módulo en lugar de una resta:
Sigue usando la
TimeUnitAPI para todos los valores mágicos y ofrece exactamente el mismo resultado.fuente
.replaceAll("^00:", "")o.replaceAll("^00:(00:)?", "")elimine minutos y horas si ambos son cero."15:00"y"10:00:23"respectivamente; Sólo principales ceros se eliminan, debido a la coincidencia de ser anclada al inicio de la entrada por^.El método genérico para esto es bastante simple:
fuente
String.format("%02d:%02d:%02d", h,m,s)?Si está utilizando los bienes comunes de Apache:
fuente
DurationFormatUtils.formatDurationHMS(timeInMS);Usé esto:
Ver descripción de la clase Formatter .
Vea el ejemplo ejecutable usando una entrada de 2400 ms.
fuente
String.format()es zona de tiempo dependiente . Sin embargo, la respuesta correcta ideal debería ser la zona horaria independiente .String.format()es zona de tiempo dependiente . Sin embargo, la respuesta correcta ideal debería ser la zona horaria independiente .Vea el ejemplo ejecutable usando una entrada de 1200 ms.
fuente
fuente
Resultados de la prueba para las 4 implementaciones
Tener que formatear muchos datos enormes necesitaba el mejor rendimiento, así que aquí están los resultados (sorprendentes):
para (int i = 0; i <1000000; i ++) {FUNCTION_CALL}
Duraciones:
formatTimeUnit: 2216 millis
fuente
StringBuilderluego cometiste el error de usar "0" + número de tipo de "ruinas". El GC de @mre JVM es extremadamente bueno en la asignación y recolección de muchos objetos de corta duración, no se preocupe allí. FuiString.formatsin una lógica de cero a la izquierda para tratar.esto funcionó para mí, con Kotlin
fuente
Siguiendo la respuesta de Bohemian, no necesitamos usar TimeUnit para encontrar un valor conocido. El código mucho más óptimo sería
Espero eso ayude
fuente
millisLeft%1000/10para que obtengamos el formatohour:minutes:seconds:millisecondsmillisLeft%1000fuente
Java 9
Esto imprime:
Estás haciendo lo correcto al permitir que los métodos de la biblioteca hagan las conversiones involucradas por ti.
java.time, la moderna API de fecha y hora de Java, o más precisamente, suDurationclase lo hace de manera más elegante y de una manera menos propensa a errores queTimeUnit.El
toMinutesPartytoSecondsPartlos métodos que he utilizado se introdujeron en Java 9.Java 6, 7 y 8
El resultado es el mismo que el anterior.
Pregunta: ¿Cómo puede funcionar eso en Java 6 y 7?
java.timeviene incorporado.org.threeten.bpcon subpaquetes.Enlaces
java.time.java.timese describió por primera vez.java.timeJava 6 y 7 (ThreeTen para JSR-310).fuente
El siguiente código realiza la conversión en ambos sentidos.
23: 59: 58: 999 a 86398999
y que
86398999 a 23: 59: 58: 999
fuente
Formato: 00: 00: 00.000
Ejemplo: 615605 Millisecend
00: 10: 15.605
fuente
La respuesta marcada como correcta tiene un pequeño error,
Por ejemplo, este es un ejemplo del valor que obtengo:
Esta es la solución para obtener el formato correcto es:
obteniendo como resultado un formato correcto:
Otra opción para obtener el formato
hh:mm:sses simplemente:fuente
Intenté como se muestra en la primera respuesta. Funciona, pero menos me llevó a la confusión. Mi respuesta por Groovy:
fuente
Para Kotlin
donde,
milSecses milisegundosfuente
Bueno, podrías probar algo como esto:
convertir milisegundos a un valor de tiempo
fuente