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:ss
formatear:
//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
TimeUnit
API :)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
TimeUnit
API 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
StringBuilder
luego 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.format
sin 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/10
para que obtengamos el formatohour:minutes:seconds:milliseconds
millisLeft%1000
fuente
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, suDuration
clase lo hace de manera más elegante y de una manera menos propensa a errores queTimeUnit
.El
toMinutesPart
ytoSecondsPart
los 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.time
viene incorporado.org.threeten.bp
con subpaquetes.Enlaces
java.time
.java.time
se describió por primera vez.java.time
Java 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:ss
es 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,
milSecs
es milisegundosfuente
Bueno, podrías probar algo como esto:
convertir milisegundos a un valor de tiempo
fuente