En un objeto de la clase Period se puede guardar una cantidad de tiempo basada en fechas en el sistema de calendario ISO-8601, como ‘2 años, 3 meses y 4 días’. Se trata de la clase equivalente a Duration, encargada de guardar intervalos de tiempo en horas, minutos, segundos y nanosegundos. Como el resto de clases de java.time, esta clase es inmutable y thread-safe
of(), ofDays(), ofMonths(), ofWeeks(), ofYears(), parse()
static Period of(int years, int months, int days)
static Period ofDays(int days)
static Period ofMonths(int months)
static Period ofWeeks(int weeks)
static Period ofYears(int years)
static Period parse(CharSequence text)
Se trata de los constructores del objeto Period que nos lo permiten obtener desde:
- Desde una secuencia numérica de años, meses y dias
- Pasándole numero de días
- Pasándole numero de meses
- Pasándole numero de semanas
- Pasándole numero de años
- Indicando el texto en una string, segun formato de Periodo
A continuación, vemos un ejemplo de como podemos utilizar estos métodos
public static void main(String[] args) {
Period per1 = Period.of(5,2,0);
System.out.println("Period.of : " + per1);
Period per2 = Period.ofDays(120);
System.out.println("Period.ofDays : " + per2);
Period per3 = Period.ofMonths(5);
System.out.println("Period.ofMonths : " + per3);
Period per4 = Period.ofWeeks(8);
System.out.println("Period.ofWeeks : " + per4);
Period per5 = Period.ofYears(1);
System.out.println("Period.ofYears : " + per5);
Period per6 = Period.parse("P2Y5M1D");
System.out.println("Period.parse : " + per6);
}
Con el siguiente resultado
withDays(), withMonths(), withYears(), from(), between()
Period withDays(int days)
Period withMonths(int months)
Period withYears(int years)
Construye un objeto Period, modificando días, meses o años en el Period original
static Period from(TemporalAmount amount)
Construye un objeto Period, modificando el original con los valores pasados en el nuevo
static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive)
Construye un objeto Period, con la distancia existente entre las dos fechas
A continuación, tenemos un ejemplo que muestra el funcionamiento de estos métodos
public static void main(String[] args) {
Period per1 = Period.of(5,3,22);
System.out.println("Period.of : " + per1);
Period per2 = per1.withDays(5);
System.out.println("Period.withDays : " + per2);
Period per3 = per1.withMonths(7);
System.out.println("Period.withMonths : " + per3);
Period per4 = per1.withYears(8);
System.out.println("Period.withYears : " + per4);
Period per5 = per1.from(Period.of(6, 0, 0));
System.out.println("Period.from : " + per5);
LocalDate f1 = LocalDate.parse("2022-10-12");
LocalDate f2 = LocalDate.parse("2022-11-13");
Period per6 = per1.between(f1, f2);
System.out.println("Period.between : " + per6);
}
Que presentara la siguiente información
plus(), plusDays(), plusMonths(), plusYears()
Period plus(TemporalAmount amountToAdd)
Period plusDays(long daysToAdd)
Period plusMonths(long monthsToAdd)
Period plusYears(long yearsToAdd)
Obtiene un nuevo periodo al que se le ha sumado el tiempo indicado
Vemos la aplicación en el siguiente ejemplo
public static void main(String[] args) {
Period per1 = Period.of(5,3,22);
System.out.println("Period.of : " + per1);
Period per2 = per1.plusDays(5);
System.out.println("Period.plusDays : " + per2);
Period per3 = per1.plusMonths(7);
System.out.println("Period.plusMonths : " + per3);
Period per4 = per1.plusYears(8);
System.out.println("Period.plusYears : " + per4);
}
Con los siguientes resultados
minus(), minus(Days(), minusMonths(), minusYears()
Period minus(TemporalAmount amountToSubtract)
Period minusDays(long daysToSubtract)
Period minusMonths(long monthsToSubtract)
Period minusYears(long yearsToSubtract)
Obtiene un nuevo periodo al que se le ha restado el tiempo indicado
Vemos la aplicación en el siguiente ejemplo
public static void main(String[] args) {
Period per1 = Period.of(5,3,22);
System.out.println("Period.of : " + per1);
Period per2 = per1.minusDays(5);
System.out.println("Period.minusDays : " + per2);
Period per3 = per1.minusMonths(7);
System.out.println("Period.minusMonths: " + per3);
Period per4 = per1.minusYears(8);
System.out.println("Period.minusYears : " + per4);
}
Y vemos que los cálculos se hacen en cada unidad, por lo que pueden quedar números negativos que no alteraran el funcionamiento del periodo
isNegative(), isZero()
boolean isNegative()
Comprueba si alguna de las tres unidades de este periodo es negativa.
boolean isZero()
Comprueba si las tres unidades de este período son cero.
get(), getDays(), getMonths(), getYears(), getChronology(), getUnits()
long get(TemporalUnit unit)
int getDays()
int getMonths()
int getYears()
Obtiene el valor correspondiente a la unidad indicada, segun el método o la TemporalUnit
List<TemporalUnit> getUnits()
Nos facilita las TemporalUnits que soporta este objeto
IsoChronology getChronology()
Obtiene la cronología de este período, que es el sistema de calendario ISO.
Podemos ver un pequeño ejemplo:
public static void main(String[] args) {
Period per1 = Period.of(5,3,0);
System.out.println("Period.of : " + per1);
int dd = per1.getDays();
System.out.println("Dias :" + dd);
int mm = per1.getMonths();
System.out.println("Meses :" + mm);
int yy = per1.getYears();
System.out.println("Años :" + yy);
System.out.println("Chronology :" + per1.getChronology());
System.out.println("TemporalUnits:" + per1.getUnits());
}
Que consigue la siguiente información
multipliedBy(), negated(), normalized()
Period multipliedBy(int scalar)
Devuelve una nueva instancia con cada elemento en este período multiplicado por el escalar especificado.
Period negated()
Devuelve una nueva instancia con cada monto en este período negado.
Period normalized()
Devuelve una copia de este periodo con los años y meses normalizados. No puede normalizar dias, porque dependen de meses concretos.
A continuación vemos un ejemplo
public static void main(String[] args) {
Period per1 = Period.of(5,14,50);
System.out.println("Period.of : " + per1);
System.out.println("multiply * 4 : " + per1.multipliedBy(4));
System.out.println("negated : " + per1.negated());
System.out.println("normalizad : " + per1.normalized());
}
Y calculará
toString(), toTotalMonths()
String toString()
Muestra el periodo como string; como P5Y14M50D
long toTotalMonths()
Calcula el total de meses expresado en el periodo, convirtiendo años a meses. Días no se tienen en cuenta en el calculo
Lo podemos ver en el siguiente ejemplo
public static void main(String[] args) {
Period per1 = Period.of(5,14,50);
System.out.println("Period.of : " + per1);
System.out.println("toString : " + per1.toString());
System.out.println("toTotalMonths : " + per1.toTotalMonths());
}
Que calcula el siguiente resultado
equals()
boolean equals(Object obj)
Comprueba si este período es igual a otro período.
Podemos verlo funcionar en este ejemplo
public static void main(String[] args) {
Period per1 = Period.of(5,14,50);
System.out.println("per1 : " + per1);
Period per2 = Period.of(5,14,50);
System.out.println("per2 : " + per2);
System.out.println("son iguales? : " + per1.equals(per2));
}
Y nos debe contestar de forma afirmativa, según vemos
addTo()
Temporal addTo(Temporal temporal)
Agrega este periodo al objeto tempòral especificado, obteniendo otro temporal. Los tipos de temporal a utilizar deberán soportar año, mes y día, y ser compatibles entre el entregado y el recibido
En el ejemplo, presentamos como podemos calcular la fecha que será dentro de 5 años, 14 meses y 50 dias.
public static void main(String[] args) {
LocalDate date = LocalDate.now();
System.out.println(date);
Period per1 = Period.of(5,14,50);
LocalDate date1 = (LocalDate) per1.addTo(date);
System.out.println(date1);
}
y la respuesta que recibimos es
Conclusión
La clase Period, es capaz de conservar los valores de intervalos en año, mes y dias, sin importar los valores, esto va a ser muy útil, tanto en el momento de calcular intervalos entre fechas, como a la hora de modificar fechas
Este articulo detalla una de las clases de la api java.time descritas anteriormente en el indice que se facilito sobre este tema
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.