localdatetime improvements examples example ejemplo java java-8 jodatime duration java-time

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 .