improvements - Formateo de una duración en Java 8/jsr310
period java ejemplo (5)
Java 8
Por extraño que parezca, no se incluyeron métodos getter convenientes para estos valores en la primera edición de java.time en Java 8.
Consulte la pregunta relacionada: ¿Por qué no puedo obtener una duración en minutos u horas en java.time? .
Java 9 y posterior
En Java 9, la clase Duration
obtiene nuevos métodos para devolver las distintas partes de días, horas, minutos, segundos, milisegundos / nanosegundos. Vea este código fuente previo a OpenJDK .
Dada una duración de 49H30M20.123S ...
-
toNanosPart()
= 123000000 -
toMillisPart()
= 123 -
toSecondsPart()
= 20 -
toMinutesPart()
= 30 -
toHoursPart()
= 1 -
toDaysPart()
= 2
No sé si se agregaron características adicionales del formateador. Pero al menos podrá generar más convenientemente sus propias cadenas a partir de los números obtenidos a través de estos nuevos métodos getter.
Estoy haciendo la transición de un proyecto de Joda-Time a las librerías de tiempo nativas de java8, y me he encontrado con un problema. No he podido encontrar un formateador para Duración. Me gustaría tener un formato de cadena personalizado de, por ejemplo, HHH + MM, donde una duración de 75 horas y 15 minutos formateará como "75 + 15". Esto fue fácil de hacer con Joda-Time al convertir a punto y usar PeriodFormatter, pero no he podido encontrar este tipo de clase en Java8. ¿Me estoy perdiendo de algo?
No hay un formateador de período / duración en jsr-310, diferente de JodaTime. No todas las funciones de JodaTime se trasladaron a JSR-310 (por ejemplo, también no PeriodType). Y a la inversa, JSR-310 tiene algunas características que no están disponibles en JodaTime (por ejemplo, números de días laborables localizados o el enfoque del patrón de estrategia con ajustadores).
Puede suceder que Java 9 introduzca algún tipo de formato de período incorporado (lea algo sobre esto de S. Colebourne).
Conclusión: JSR-310 y JodaTime no son totalmente compatibles entre sí, por lo que puede requerirse mucho trabajo. No estaría tan interesado en la migración lo antes posible. ¿Necesita características especiales de JSR-310 que JodaTime no ofrece?
Nota adicional: también debe tener en cuenta que el período joda (que incluye todas las unidades de años a segundos) no es totalmente compatible con jsr310-period (solo años, meses, días) o jsr310-duration (solo horas, minutos, segundos y fracción de segundos).
No hay un método incorporado, pero puede acceder al número de horas / minutos sin tener que calcularlos manualmente. Su formato específico podría verse así:
Duration d = Duration.of(75, HOURS).plusMinutes(15);
long hours = d.toHours(); //75
long minutes = d.minusHours(hours).toMinutes(); //15
String HH_PLUS_MM = hours + "+" + minutes; //75+15
System.out.println(HH_PLUS_MM);
Si se garantiza que la duración será inferior a 24 horas, también puede usar este truco:
String hhPlusMm = LocalTime.MIDNIGHT.plus(d).format(DateTimeFormatter.ofPattern("HH+mm"));
Sé que esta es una vieja pregunta, pero recientemente me encontré con lo mismo. Realmente debería haber una mejor solución que esta, pero esto funcionó para mí:
public static String millisToElapsedTime(long millis){
DateFormat fmt = new SimpleDateFormat(":mm:ss.SSS");
fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
return (millis/3600000/*hours*/)+fmt.format(new Date(millis));
}
Entonces, podrías agregar esto:
public static String durationToElapsedTime(Duration d){
return millisToElapsedTime(d.toMillis());
}
puede usar DurationFormatUtils de commons-lang3-time (para minutos debe usar "mm" ya que el formato es el mismo que en SimpleDateFormat
): DurationFormatUtils.formatDuration(interval.toMillis(), "HHH+mm")
Tristemente, no encontré ninguna forma de excluir partes vacías, como en mi caso los días u horas podían ser 0, así que aún tenía que hacer mi propia versión.
Actualización: He abierto un problema para esto en Apache commons.lang.time.DurationFormatUtils JIRA .