La clase TemporalAdjuster, llega con una serie de métodos predefinidos que retornan un TemporalAdjuster y nos permite ajustar objetos relacionados con el tiempo de distintas formas. Funciones que tenían como único fin saber en que día empezaba o terminaba un mes, que dia es el proximo jueves, o cuando es el segundo lunes del mes, quedan obsoletas con el uso de la nueva API que proporciona Java8
La forma habitual de trabajar será
temporal = temporal.with(thisAdjuster);
Para conseguir el valor buscado, los métodos estáticos que vienen incorporados son
Funcion | Utilidad |
---|---|
dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek) | Ajusta al dia del mes que cumple con el dia de la semana, por Ej: «tercer domingo» |
firstDayOfMonth() | Ajusta a primer día del mismo mes |
firstDayOfNextMonth() | Ajusta a primer dia del siguiente mes |
firstDayOfNextYear() | Ajusta a primer dia del siguiente año |
firstDayOfYear() | Ajusta a primer dia del año actual |
firstInMonth(DayOfWeek dayOfWeek) | Ajusta a primer dia del mes que cumple con el dia de la semana indicado |
lastDayOfMonth() | Ajusta a ultimo dia del mes |
lastDayOfYear() | Ajusta a ultimo dia del año actual |
lastInMonth(DayOfWeek dayOfWeek) | Ajusta a ultimo dia del mes que cumple con el dia de la semana indicado |
next(DayOfWeek dayOfWeek) | Ajusta al dia del mes correspondiente al siguiente dia de la semana indicado |
nextOrSame(DayOfWeek dayOfWeek) | Ajusta como next(), a menos que el dia actual coincide con el dia buscado, en cuyo caso ajusta sobre el mismo |
previous(DayOfWeek dayOfWeek) | Ajusta al dia del mes correspondiente al anterior dia de la semana indicado |
previousOrSame(DayOfWeek dayOfWeek) | Ajusta como previous(), a menos que el dia actual coincide con el dia buscado, en cuyo caso ajusta sobre el mismo |
ofDateAdjuster(UnaryOperator dateBasedAdjuster) |
A continuación, hay una clase que calcula algunas fechas
public static void main(String[] args) {
LocalDate hoy = LocalDate.now();
System.out.println("Estamos a :" + hoy);
//Segundo domingo del mes
LocalDate fecha = hoy.with(TemporalAdjusters.dayOfWeekInMonth(2,DayOfWeek.SUNDAY));
System.out.println("El segundo domingo del mes :" + fecha);
//Segundo domingo del mes
fecha = hoy.with(TemporalAdjusters.firstDayOfNextMonth());
System.out.println("El primer dia del siguientel mes :" + fecha);
//Segundo domingo DEL SIGUIENTE MES
fecha = hoy.with(TemporalAdjusters.firstDayOfNextMonth())
.with(TemporalAdjusters.dayOfWeekInMonth(2,DayOfWeek.SUNDAY));
System.out.println("El segundo domingo del siguiente mes :" + fecha);
}
El resultado seria algo como:
Creando reglas propias
Podemos crear nuestros propios ajustes definiendo una clase que implemente la interfaz, aunque como es una interfaz funcional, también la podemos crear en nuestro método sin problema.
Imaginemos que trabajamos con regularidad con 7 días de distancia; esto es, nos dan una fecha, y tenemos que determinar la fecha que será dentro de 7
public static void main(String[] args) {
TemporalAdjuster mas7 = t -> t.plus(Period.ofDays(7));
LocalDate hoy = LocalDate.now();
LocalDate envio = hoy.with(mas7);
System.out.println("Estamos a :" + hoy);
System.out.println("El envío será:" + envio);
}
Puede que sea muy sencillo, pero si añadimos que nuestros envíos solo se realizan en lunes?
Pues a nuestra implementación le tendríamos que añadir algo como
TemporalAdjuster mas7 = t -> {
Temporal nuevo = t.plus(Period.ofDays(7));
nuevo = nuevo.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
return nuevo;
};
Aunque todo eso lo podemos simplificar dejando el código como
public static void main(String[] args) {
// TemporalAdjuster mas7 = t -> {
// Temporal nuevo = t.plus(Period.ofDays(7));
// nuevo = nuevo.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
// return nuevo;
// };
TemporalAdjuster mas7 = t -> t.plus(Period.ofDays(7))
.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
LocalDate hoy = LocalDate.now();
LocalDate envio = hoy.with(mas7);
System.out.println("Estamos a :" + hoy);
System.out.println("El envío será:" + envio);
}
Conclusión
La clase TemporalAdjuster, nos permite modificar facilmente los objetos TEMPORAL, para que luego puedan ser reutilizados en el resto de clases de la api java.time
Este articulo detalle 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.