Enjoy A New Student Discount All 55,000 Courses on sale for Only $12.99

Ends in 05h 23m 49s

Java 8 – Period

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


Descubre más desde Recursos para formacion

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Deja un comentario

/*Si te ha gustado el artículo
no dudes en compartirlo*/

Facebook
Twitter
LinkedIn

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies

Ver mi IP

Ver ip de mi máquina
tipo valor
Ip: 18.97.14.80
Proxy: 18.97.14.80
Remote host: 18-97-14-80.crawl.commoncrawl.org
Remote port: 38174
** 18.97.14.80, 172.68.245.26