Clase Period de Java
PeriodLa clase Period es parte de una API de fecha y hora introducida en Java 8, ubicada en eljava.timepaquete java.time.
La clase Period se utiliza principalmente para representar el intervalo de tiempo entre dos fechas, en unidades de años, meses y días. A diferencia de laDurationclase Duration (que representa intervalos basados en tiempo, como horas, minutos y segundos),Periodse centra en las diferencias a nivel de fecha.
Características principales
1. Inmutabilidad
PeriodLa clase Period es inmutable, lo que significa que una vez que se crea unPeriodobjeto Period, su valor no puede ser modificado. Cualquier operaciónPeriodsobre un Period (como suma o resta) devolverá una nuevaPeriodinstancia.
2. Cálculo basado en fechas
PeriodSe especializa en el cálculo de años, meses y días, adecuado para escenarios como cumpleaños, duración de contratos, etc.
3. Integración con LocalDate
PeriodNormalmente se usa junto con laLocalDateclase LocalDate para calcular la diferencia entre dos fechas o añadir/restar un período de tiempo a una fecha.
Métodos comunes
Crear objetos Period
1. Usando elof()método of().
Ejemplo
2. Usando elbetween()método between() para calcular el intervalo entre dos fechas.
Ejemplo
LocalDate endDate = LocalDate.of(2021, 3, 4);
Period period = Period.between(startDate, endDate);
3. Usando elparse()método parse() para crear desde una cadena.
Ejemplo
Obtener las partes de un Period
Ejemplo
int months = period.getMonths(); // Obtener el número de meses
int days = period.getDays(); // Obtener el número de días
Operaciones
1. Operaciones de suma y resta
Ejemplo
Period subtracted = period.minusDays(5);
2. Comprobar si es negativo
Ejemplo
3. Normalizar un Period
Ejemplo
Ejemplos de aplicación práctica
Calcular el intervalo entre dos fechas
Ejemplo
LocalDate currentDate = LocalDate.now();
Period age = Period.between(birthDate, currentDate);
System.out.printf("Edad: %d años %d meses %d días",
age.getYears(), age.getMonths(), age.getDays());
Añadir un Period a una fecha
Ejemplo
Period twoMonths = Period.ofMonths(2);
LocalDate futureDate = today.plus(twoMonths);
Comprobar si el período está vacío
Ejemplo
if (zeroPeriod.isZero()) {
System.out.println("Este es un período cero");
}
Ejemplo completo
Ejemplo
import java.time.LocalDate;
public class PeriodDemo {
public static void main(String[] args) {
// Varias formas de crear un objeto Period
// 1. Usando el método of()
Period period1 = Period.of(1, 2, 15); // 1 año 2 meses 15 días
System.out.println("Period 1: " + period1);
// 2. Usando el método between() para calcular el período entre dos fechas
LocalDate startDate = LocalDate.of(2020, 1, 1);
LocalDate endDate = LocalDate.of(2023, 5, 15);
Period period2 = Period.between(startDate, endDate);
System.out.println("Period between dates: " + period2);
// 3. Usando el método parse() para crear desde una cadena
Period period3 = Period.parse("P1Y2M15D"); // Formato ISO-8601
System.out.println("Parsed Period: " + period3);
}
}
El resultado es:
Period 1: P1Y2M15D Period between dates: P3Y4M14D Parsed Period: P1Y2M15D
Notas
- Problemas de precisión:
PeriodSolo calcula las diferencias de años, meses y días; no considera las diferencias de tiempo (horas, minutos, etc.). - Manejo de valores negativos: si la fecha de finalización es anterior a la fecha de inicio,
Period.between()devolverá un valor negativo. - Diferencias en los días de los meses:
PeriodEl cálculo considera las diferencias en el número de días de los distintos meses (por ejemplo, febrero tiene 28 o 29 días). - Formato ISO-8601: al usar el
parse()método parse(), la cadena debe seguir elPnYnMnDformato ISO-8601 (como "P1Y2M3D").
Resumen
PeriodLa clase Period es una herramienta poderosa en la API de fecha y hora de Java para manejar intervalos basados en fechas. A través de ella, los desarrolladores pueden realizar fácilmente cálculos de fechas a nivel de año, mes y día, especialmente adecuada para escenarios de negocio que requieren precisión a nivel de fecha. Dominar elPerioduso de la clase Period puede hacer que tu código de manejo de fechas sea más conciso y legible.