LocalDate
LocalDate es un objeto de tiempo, inmutable, que guarda la fecha como una etapa de Año-mes-día. Es uno de los objetos que podemos proponer para cambiar por Date o Calendar, debido a los métodos que posee.
Se ha de remarcar que no se puede considerar que pueda representar tiempo, porque no contiene ni el desplazamiento, ni la zona a que pertenece la fecha, sin embargo ya es útil para establecer la fecha actual, o trabajar con cumpleaños.
now(), of(), ofEpochDay(), ofYearDay(), parse(),from()
static LocalDate now()
static LocalDate now(Clock clock)
static LocalDate now(ZoneId zone)
static LocalDate of(int year, int month, int dayOfMonth)
static LocalDate of(int year, Month month, int dayOfMonth)
static LocalDate ofEpochDay(long epochDay)
static LocalDate ofYearDay(int year, int dayOfYear)
static LocalDate parse(CharSequence text)
static LocalDate parse(CharSequence text, DateTimeFormatter formatter)
static LocalDate from(TemporalAccessor temporal)
Crea un objeto LocalDate desde diversos orígenes
- Desde el reloj del sistema
- Desde un reloj definido
- Desde el reloj del sistema en la zona indicada
- Pasandole tres enteros correspondientes a año, mes y dia
- Pasándole año como entero, mes como literal y día como entero
- Indicando el numero de días transcurridos desde 1/1/1970
- Pasandole el año, y el dia del año
- Indicando el texto en una string, añadiéndole patrón de formato si no es el estandar
- Desde otro campo temporal que contenga la información necesaria (día, mes, año)
En el ejemplo, mostramos todas las posibilidades indicadas
public static void main(String[] args) {
LocalDate hoy = LocalDate.now();
Clock clock = Clock.systemDefaultZone();
LocalDate hoyDef = LocalDate.now(clock);
LocalDate hoyMX = LocalDate.now(ZoneId.of("America/Mexico_City"));
System.out.println("Hoy :" + hoy);
System.out.println("Hoy Def :" + hoyDef);
System.out.println("Hoy MX :" + hoyMX);
//---of
LocalDate unDia = LocalDate.of(2021, 10,29);
LocalDate otroDia = LocalDate.of(2022, Month.FEBRUARY ,28);
System.out.println("unDia :" + unDia);
System.out.println("otroDia :" + otroDia);
//ofEpoch, ofYear
LocalDate desdeEpoch = LocalDate.ofEpochDay(20);
LocalDate desdeYear = LocalDate.ofYearDay(2022,360);
System.out.println("desdeEpoch :" + desdeEpoch);
System.out.println("desdeYear :" + desdeYear);
// parse
LocalDate dParse = LocalDate.parse("2020-08-15");
DateTimeFormatter formato = DateTimeFormatter.ofPattern("dd MMMM yyyy");
LocalDate dParseF = LocalDate.parse("12 febrero 2020", formato);
System.out.println("dParse :" + dParse);
System.out.println("dParseF :" + dParseF);
// from
LocalDateTime ahora = LocalDateTime.now();
LocalDate pFrom = LocalDate.from(ahora);
System.out.println("dFrom :" + pFrom);
}
Dando como resultado

with(), withDayOfMonth(), withDayOfYear(), withMonth(), withYear()
LocalDate with(TemporalAdjuster adjuster)
LocalDate with(TemporalField field, long newValue)
LocalDate withDayOfMonth(int dayOfMonth)
LocalDate withDayOfYear(int dayOfYear)
LocalDate withMonth(int month)
LocalDate withYear(int year)
Crea un objeto LocalDate desde otro objeto LocalDate existente, modificando el dato que se le indica al seleccionar el método
En el ejemplo que continua, podemos ver como nos basta una sola linea para cambiar la fecha. en la parte que nos interese(Dia, mes o año), dejando el resto de valores igual
public static void main(String[] args) {
LocalDate hoy = LocalDate.now();
System.out.println("Hoy :" + hoy);
LocalDate d10 = hoy.with(ChronoField.DAY_OF_MONTH,10);
System.out.println("d10 :" + d10);
LocalDate dlm = hoy.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("dlm :" + dlm);
LocalDate d20 = hoy.withDayOfMonth(20);
System.out.println("d20 :" + d20);
LocalDate dAny = hoy.withDayOfYear(364);
System.out.println("dAny :" + dAny);
LocalDate cambioMes = hoy.withMonth(8);
System.out.println("cambioMes :" + cambioMes);
LocalDate cambioAny = hoy.withYear(2034);
System.out.println("cambioAny :" + cambioAny);
}
Los resultados obtenidos son los siguientes

plus(), plusDays(), plusMonths(), plusWeeks(), plusYears()
LocalDate plus(long amountToAdd, TemporalUnit unit)
LocalDate plus(TemporalAmount amountToAdd)
LocalDate plusDays(long daysToAdd)
LocalDate plusMonths(long monthsToAdd)
LocalDate plusWeeks(long weeksToAdd)
LocalDate plusYears(long yearsToAdd)
Crea un objeto LocalDate a partir de otro objeto LocalDate y sumándole el dato según el método asociado
En el ejemplo vemos como podemos sumar dias, meses o años a una fecha de forma simple
public static void main(String[] args) {
LocalDate date = LocalDate.of(2018, Month.DECEMBER, 25);
date = date.plusDays(2); // sumo dos dias
System.out.println(date); // presenta 2018-12-27
date = date.plusWeeks(1); // sumo 1 semana a 2018-12-27
System.out.println(date); // presenta 2019-01-03
date = date.plusMonths(1);
System.out.println(date); // presenta la misma fecha un mes despues
date = date.plusYears(1); // duma un año
System.out.println(date); // 2020-02-03
}
Y los resultados son los previstos

minus(), minusDays(), minusMonths(), minusWeeks(), minusYears()
LocalDate minus(long amountToSubtract, TemporalUnit unit)
LocalDate minus(TemporalAmount amountToSubtract)
LocalDate minusDays(long daysToSubtract)
LocalDate minusMonths(long monthsToSubtract)
LocalDate minusWeeks(long weeksToSubtract)
LocalDate minusYears(long yearsToSubtract)
Crea un objeto LocalDate a partir de otro objeto LocalDate y restándole el dato según el método asociado
En el ejemplo, vemos como podemos restar a una fecha, el tiempo que queramos
public static void main(String[] args) {
LocalDate date = LocalDate.of(2016, Month.FEBRUARY, 13);
date = date.minusDays(7); //resto 7 dias
System.out.println(date); // 2016-02-06
date = date.minusMonths(2); //resto 2 meses
System.out.println(date); // 2015-12-06
date = date.minus(100,ChronoUnit.DAYS); //resto 100 dias
System.out.println(date); // 2015-08-28
}
isAfter(), isBefore(), isEqual(), isLeapYear(), isSupported(), equals(), compareTo()
boolean isAfter(ChronoLocalDate other)
boolean isBefore(ChronoLocalDate other)
boolean isEqual(ChronoLocalDate other)
boolean equals(Object obj)
int compareTo(ChronoLocalDate other)
Podemos comparar el LocalDate con otros, para determinar si es la misma fecha, si es anterior o si es posterior
Por ejemplo, comprobamos si una fecha es posterior a otra
public static void main(String[] args) {
LocalDate d1 = LocalDate.of(2022, Month.AUGUST, 13);
LocalDate d2 = LocalDate.of(2022, Month.APRIL, 13);
System.out.println("d1 :" + d1);
System.out.println("d2 :" + d2);
System.out.println("d1.isAfter(d2 ) :" + d1.isAfter(d2));
}
y dara:

boolean isLeapYear()
Nos indica si la fecha esta dentro de un año bisiesto, por ejemplo:
public static void main(String[] args) {
LocalDate d1 = LocalDate.of(2022, Month.AUGUST, 13);
System.out.println("d1 :" + d1);
System.out.println("d1 es bisiesto? :" + d1.isLeapYear());
LocalDate d2 = LocalDate.of(2024, Month.APRIL, 13);
System.out.println("d2 :" + d2);
System.out.println("d2 es bisiesto? :" + d2.isLeapYear());
}
nos da:

boolean isSupported(TemporalField field)
boolean isSupported(TemporalUnit unit)
Nos indica si la unidad o el tipo de campo esta soportado en el LocalDate
public static void main(String[] args) {
LocalDate d1 = LocalDate.of(2022, Month.AUGUST, 13);
boolean ms = d1.isSupported(ChronoField.MILLI_OF_SECOND);
boolean dw = d1.isSupported(ChronoField.DAY_OF_WEEK);
boolean mo = d1.isSupported(ChronoUnit.MONTHS);
System.out.println("Soporta ChronoField.MILLI_OF_SECOND:"+ms);
System.out.println("Soporta ChronoField.DAY_OF_WEEK:"+dw);
System.out.println("Soporta ChronoUnit.MONTHS:"+mo);
}
nos responde

get(), getChronology(), getDayOfMonth(), getDayOfWeek(), getDayOfYear(), getEra(), getLong(), getMonth(), getMonthValue(), getYear()
int getDayOfMonth()
int getMonthValue()
int getYear()
int getDayOfYear()
Facilitan el día, numero de mes ,año de la fecha y el día del año, todo a campos de tipo «int»
DayOfWeek getDayOfWeek()
Month getMonth()
Entregan las enumeraciones correspondientes.
int get(TemporalField field)
long getLong(TemporalField field)
Facilita en int o long la información solicitada
Era getEra()
IsoChronology getChronology()
Facilita el objeto Era y el Cronology (tipo de calendario)
En el ejemplo que continua, vemos como emplear estas funciones en una fecha concreta
public static void main(String[] args) {
LocalDate hoy = LocalDate.now();
System.out.println("Fecha :" +
hoy.toString());
System.out.println("Dia mes :" +
hoy.getDayOfMonth());
System.out.println("Numero mes :" +
hoy.getMonthValue());
System.out.println("Año :" +
hoy.getYear());
System.out.println("Dia Año :" +
hoy.getDayOfYear());
System.out.println("Dia semana Obj :" +
hoy.getDayOfWeek());
System.out.println("Mes Obj :" +
hoy.getMonth());
System.out.println("----------------------------------------");
System.out.println("Dia cualquiera int :" +
hoy.get(ChronoField.DAY_OF_MONTH));
System.out.println("ERA cualquiera Long :" +
hoy.getLong(ChronoField.ERA));
System.out.println("EPOCH cualquiera Long :" +
hoy.getLong(ChronoField.EPOCH_DAY));
System.out.println("----------------------------------------");
System.out.println("Era :" +
hoy.getEra());
System.out.println("Calendario :" +
hoy.getChronology());
}
Que generara una salida como:

lengthOfMonth(), lengthOfYear()
int lengthOfMonth()
int lengthOfYear()
Nos facilita el numero de días que tiene el mes o el año de la fecha
public static void main(String[] args) {
LocalDate hoy = LocalDate.now();
System.out.println("Fecha :" +
hoy.toString());
System.out.println("Longitud mes :" +
hoy.lengthOfMonth());
System.out.println("Longitud año :" +
hoy.lengthOfYear());
}
Las instrucción nos facilitaran los días de duración del mes que se encuentre en el LocalDate, y de dicho año. en nuestro caso:

range()
ValueRange range(TemporalField field)
Facilita el rango con que podemos filtrar cualquiera de los valores soportados
public static void main(String[] args) {
LocalDate hoy = LocalDate.now();
System.out.println("Fecha :" +
hoy.toString());
System.out.println("Rango dias mes :" +
hoy.range(ChronoField.DAY_OF_MONTH));
System.out.println("Rango dias año :" +
hoy.range(ChronoField.DAY_OF_YEAR));
}
Nos facilita el rango de días para el mes actual, y para el año actual

toEpochDay(), toString()
long toEpochDay()
String toString()
Convierte la fecha en numero de dias transcurridos desde 1/1/1970, o la facilita en formato string como 2022-11-13
public static void main(String[] args) {
LocalDate hoy = LocalDate.now();
System.out.println("Fecha :" +
hoy.toString());
System.out.println("to epoch :" +
hoy.toEpochDay());
}
Presenta en consola

until()
Period until(ChronoLocalDate endDateExclusive)
Obtiene la distancia, en Period, que hay entre dos fechas
long until(Temporal endExclusive, TemporalUnit unit)
Obtiene la distancia que hay entre dos fechas, en las unidades indicadas
En el ejemplo, obtenemos la distancia en Periodo y en numero de dias
public static void main(String[] args) {
LocalDate d1 = LocalDate.of(2022, Month.AUGUST, 13);
System.out.println("d1 :" + d1);
LocalDate d2 = LocalDate.of(2024, Month.APRIL, 13);
System.out.println("d2 :" + d2);
Period p = d1.until(d2);
System.out.println("Period :" + p);
long dias = d1.until(d2, ChronoUnit.DAYS);
System.out.println("Period :" + dias);
}
Que nos presentará

format()
String format(DateTimeFormatter formatter)
Formatea la fecha según la forma deseada
En el ejemplo, se muestran algunos formatos. Es conveniente revisar DateTimeFormatter
public static void main(String[] args) {
LocalDate hoy = LocalDate.now();
String formattedDate = hoy.format(DateTimeFormatter
.ofLocalizedDate(FormatStyle.LONG));
System.out.println("LONG format : " + formattedDate);
formattedDate = hoy.format(DateTimeFormatter
.ofLocalizedDate(FormatStyle.MEDIUM));
System.out.println("MEDIUM format : " + formattedDate);
formattedDate = hoy.format(DateTimeFormatter
.ofLocalizedDate(FormatStyle.SHORT));
System.out.println("SHORT format : " + formattedDate);
formattedDate = hoy.format(DateTimeFormatter
.ofLocalizedDate(FormatStyle.FULL));
System.out.println("FULL format : " + formattedDate);
String formateado = hoy.format(DateTimeFormatter.ofPattern("dd - MMM - yy"));
System.out.println("Formato manual..: " + formateado);
}
No presenta

adjustInto()
Temporal adjustInto(Temporal temporal)
Obtiene un objeto temporal tras aplicarle al LocalDate el ajuste indicado. El objeto obtenido esta limitado por el tipo de ajuste
En el ejemplo, vemos como podemos cambiar una fecha, sin modificar la hora ni la zona
public static void main(String[] args) {
ZonedDateTime date = ZonedDateTime.now();
System.out.println(date);
LocalDate date1 = LocalDate.parse("2017-02-03");
date = (ZonedDateTime)date1.adjustInto(date);
System.out.println(date);
}
Nos presenta

atStartOfDay(), atTime()
LocalDateTime atStartOfDay()
ZonedDateTime atStartOfDay(ZoneId zone)
LocalDateTime atTime(int hour, int minute)
LocalDateTime atTime(int hour, int minute, int second)
LocalDateTime atTime(int hour, int minute, int second, int nanoOfSecond)
LocalDateTime atTime(LocalTime time)
OffsetDateTime atTime(OffsetTime time)
Combina el LocalDate con los valores facilitados para obtener un objeto temporal de fecha y hora
En el ejemplo, obtenemos un LocalDateTime con la hora de inicio de dia (00:00) y luego otro con las 14:20
public static void main(String[] args) {
LocalDate hoy = LocalDate.now();
System.out.println("hoy : " + hoy);
LocalDateTime ahora = hoy.atStartOfDay();
System.out.println("at StartOfDay : " + ahora);
LocalDateTime despues = hoy.atTime(14,20);
System.out.println("at 14:20 : " + despues);
}
y su resultado

Conclusión
La clase LocalDate, mantiene una fecha (dia, mes y año) y puede 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