El nuevo API de fechas en Java 8 reescribe por completo los viejos APIs como java.util.Date o java.util.Calendar y nos proporciona nuevas operaciones para facilitar operaciones muy comunes. En este post vamos a ver como calcular distintos días a partir de una fecha concreta o la fecha actual.

Calcular el último día de un mes

Un cálculo muy común puede ser saber cual es el último día de un mes a partir de una fecha o para el día actual. Gracias al API de LocalDate y a la clase TemporalAdjusters, tenemos un conjunto de operaciones predefinidas para hacer estos cálculos triviales:


// Fecha actual
LocalDate hoy = LocalDate.now();

// Último día del mes
LocalDate ultimoDia = hoy.with(TemporalAdjusters.lastDayOfMonth());

Calcular el primer día del siguiente mes

Este cálculo es muy sencillo…​ bastaría con establecer la fecha al día 1 y sumar 1 mes…​ pero de nuevo, la clase TemporalAdjusters nos facilita aún más la tarea:


// Fecha actual
LocalDate hoy = LocalDate.now();

// Primer día del mes siguiente
LocalDate primerDiaSiguienteMes = hoy.with(TemporalAdjusters.firstDayOfNextMonth());

Calcular el siguiente día de la semana a partir de una fecha

Supongamos que estamos en un día cualquiera, y queremos saber cuando será el próximo sábado…​ o el próximo lunes, o cualquier otro día de la semana. Pues sencillamente, tenemos los métodos next o nextOrSame que recibe un DayOfWeek para calcularlo:


// Fecha actual
LocalDate hoy = LocalDate.now();

// El siguiente lunes
LocalDate siguienteLunes = now.with(TemporalAdjusters.next(DayOfWeek.MONDAY);

// El siguiente domingo, salvo que hoy sea domingo, que entonces devolvería hoy.
LocalDate siguienteDomingo = now.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY);

Calcular el anterior día de la semana a partir de una fecha

Del mismo modo que calculamos el día siguiente de una fecha concreta, podemos hacerlo hacía atrás, y calcular el viernes anterior…​ o cualquier otro día de la semana. Los métodos análogos son previous y previousOrSame y reciben igual un DayOfWeek para indicar el día de la semana que queremos calcular:


// Fecha actual
LocalDate hoy = LocalDate.now();

// El anterior martes
LocalDate anteriorMartes = now.with(TemporalAdjusters.previous(DayOfWeek.TUESDAY);

// El anterior sábado, salvo que hoy sea sábado, que entonces devolvería hoy.
LocalDate anteriorSabado = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.SATURDAY);

Calcular el primer día de la semana en un mes

Para terminar con el cálculo de fechas y los métodos utilidad de TemporalAdjusters, vamos a explicar como podemos obtener el primer día (lunes, martes, miércoles…​) de un mes. Por ejemplo, en España, el día de la madre se celebra el primer domingo de mayo. Esto quiere decir, que cada año la festividad se celebra un día distinto en función de como coincida el calendario. Para calcular este día en Java, simplemente tendríamos que hacer:


// Día de la madre 2022
LocalDate diaMadre2022 = LocalDate.of(2022, 5, 1).with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY));

// Día de la madre 2023
LocalDate diaMadre2023 = LocalDate.of(2023, 5, 1).with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY));

Como has podido comprobar…​ el API de LocalDate junto a la clase utilidad TemporalAdjusters nos facilita mucho los cálculos con fechas más comunes en nuestro día a día programando.