Java Duration Clase
La clase Duration es una clase importante en la API de fecha y hora (paquete java.time) introducida en Java 8, utilizada para representar intervalos de tiempo o duraciones.
La clase Duration se utiliza principalmente para calcular la diferencia entre dos puntos de tiempo, o para representar una longitud de tiempo específica.
Conceptos básicos
Los intervalos de tiempo representados por la clase Duration pueden ser precisos a nivel de nanosegundos. Se utiliza principalmente para manejar cantidades basadas en el tiempo (horas, minutos, segundos y nanosegundos), sin involucrar conceptos de fecha o zona horaria.
Características principales:
- Inmutabilidad: los objetos Duration no se pueden modificar una vez creados
- Seguridad para subprocesos: se puede usar de forma segura en entornos multiproceso
- Alta precisión: puede ser preciso a nivel de nanosegundos
- Encadenamiento: admite el encadenamiento de métodos
Crear objetos Duration
La clase Duration proporciona varios métodos estáticos para crear instancias de Duration:
1. Crear mediante unidades de tiempo
Ejemplo
Duration twoHours = Duration.ofHours(2);
// Crear una Duration que dure 30 minutos
Duration thirtyMinutes = Duration.ofMinutes(30);
// Crear una Duration que dure 45 segundos
Duration fortyFiveSeconds = Duration.ofSeconds(45);
// Crear una Duration que dure 500 milisegundos
Duration fiveHundredMillis = Duration.ofMillis(500);
// Crear una Duration que dure 1000000 nanosegundos
Duration oneMillionNanos = Duration.ofNanos(1_000_000);
2. Crear mediante cantidades de tiempo
Ejemplo
Duration customDuration = Duration.ofDays(1).plusHours(2).plusMinutes(3);
3. Calcular entre dos puntos de tiempo
Ejemplo
// Realizar algunas operaciones...
Instant end = Instant.now();
Duration elapsed = Duration.between(start, end);
4. Crear mediante análisis de cadenas
Ejemplo
Duration parsedDuration = Duration.parse("PT2H30M15S"); // 2 horas 30 minutos 15 segundos
Métodos comunes
La clase Duration proporciona un amplio conjunto de métodos para manejar intervalos de tiempo:
1. Obtener valores de tiempo
Ejemplo
long hours = duration.toHours(); // 2
long minutes = duration.toMinutes(); // 150
long seconds = duration.getSeconds(); // 9000
int nanos = duration.getNano(); // 0
2. Operaciones de tiempo
Ejemplo
Duration d2 = Duration.ofMinutes(30);
// Suma
Duration sum = d1.plus(d2); // 2 horas 30 minutos
// Resta
Duration diff = d1.minus(d2); // 1 hora 30 minutos
// Multiplicación
Duration multiplied = d1.multipliedBy(3); // 6 horas
// División
Duration divided = d1.dividedBy(2); // 1 hora
3. Operaciones de comparación
Ejemplo
Duration d2 = Duration.ofMinutes(90);
boolean isEqual = d1.equals(d2); // false
int comparison = d1.compareTo(d2); // -1 (d1 < d2)
boolean isNegative = d1.isNegative(); // false
boolean isZero = d1.isZero(); // false
4. Otros métodos útiles
Ejemplo
// Convertir a otras unidades
long hours = duration.toHours(); // 1
long minutes = duration.toMinutes(); // 90
long seconds = duration.toSeconds(); // 5400
long millis = duration.toMillis(); // 5400000
long nanos = duration.toNanos(); // 5400000000000
// Obtener cada parte
long secondsPart = duration.getSeconds(); // 5400
int nanoPart = duration.getNano(); // 0
// Obtener el valor absoluto
Duration absDuration = duration.abs();
// Obtener el valor negativo
Duration negated = duration.negated();
Ejemplos de aplicación práctica
Ejemplo 1: Calcular el tiempo de ejecución del código
Ejemplo
// Simular una operación que consume tiempo
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant end = Instant.now();
Duration elapsed = Duration.between(start, end);
System.out.println("Tiempo de ejecución del código: " + elapsed.toMillis() + " milisegundos");
Ejemplo 2: Conversión de formato de tiempo
Ejemplo
// Convertir al formato "HH:MM:SS"
long hours = duration.toHours();
long minutes = duration.minusHours(hours).toMinutes();
long seconds = duration.minusHours(hours).minusMinutes(minutes).getSeconds();
String formatted = String.format("%02d:%02d:%02d", hours, minutes, seconds);
System.out.println(formatted); // Salida: 02:15:00
Ejemplo 3: Control de tiempo de espera
Ejemplo
Instant startTime = Instant.now();
while (true) {
// Comprobar si se ha agotado el tiempo
if (Duration.between(startTime, Instant.now()).compareTo(timeout) > 0) {
System.out.println("Tiempo de espera agotado");
break;
}
// Realizar otras operaciones...
}
Ejemplo
import java.time.LocalTime;
import java.time.Instant;
public class DurationDemo {
public static void main(String[] args) {
// Varias formas de crear objetos Duration
// 1. Usando el método of...()
Duration duration1 = Duration.ofHours(2); // 2 horas
Duration duration2 = Duration.ofMinutes(90); // 90 minutos
System.out.println("Duration 1: " + duration1);
System.out.println("Duration 2: " + duration2);
// 2. Usando el método between() para calcular la duración entre dos puntos de tiempo
LocalTime startTime = LocalTime.of(9, 0);
LocalTime endTime = LocalTime.of(11, 30);
Duration duration3 = Duration.between(startTime, endTime);
System.out.println("Duration between times: " + duration3);
// 3. Usando el método parse() para crear a partir de una cadena
Duration duration4 = Duration.parse("PT2H30M"); // Formato ISO-8601
System.out.println("Parsed Duration: " + duration4);
// 4. Usando Instant para calcular la diferencia de tiempo
Instant startInstant = Instant.now();
// Simular una operación que consume tiempo
try { Thread.sleep(1500); } catch (InterruptedException e) {}
Instant endInstant = Instant.now();
Duration duration5 = Duration.between(startInstant, endInstant);
System.out.println("Execution duration: " + duration5.toMillis() + "ms");
}
}
El resultado de la salida es:
Duration 1: PT2H Duration 2: PT1H30M Duration between times: PT2H30M Parsed Duration: PT2H30M Execution duration: 1501ms
Notas
Problema de precisión: Duration puede ser preciso a nivel de nanosegundos, pero la precisión real depende del soporte del sistema operativo y el hardware.Diferencia con Period
Duration se utiliza para medir horas, minutos, segundos y nanosegundos basados en el tiempo:
- Period se utiliza para medir años, meses y días basados en fechas
- Inmutabilidad: todos los objetos Duration son inmutables; cualquier operación de modificación devuelve una nueva instancia de Duration.
Manejo de valores negativos: Duration puede representar intervalos de tiempo negativos, lo cual puede ocurrir al calcular diferencias de tiempo.Formato de cadena: utiliza el formato de duración ISO-8601
, donde:P es el indicador de duración
D es el número de díasT es el separador de la parte de tiempo
PnDTnHnMn.nSH es el número de horas- M es el número de minutos
- S es el número de segundos (puede tener parte decimal)
- Resumen
- La clase Duration de Java proporciona una herramienta potente y flexible para manejar intervalos de tiempo. Al dominar el uso de la clase Duration, los desarrolladores pueden manejar más fácilmente diversas necesidades relacionadas con el cálculo de tiempo, como medición de rendimiento, control de tiempo de espera, programación de tareas, etc. La clase Duration, utilizada junto con otras clases de fecha y hora introducidas en Java 8 (como Instant, LocalDateTime, etc.), puede construir un código de manejo de tiempo más robusto y legible.
- Otras extensiones
- IA pensando...
Resumen
Java InputStream Clase
Lista de notas