El paquete java.time, introducido en Java 8, contiene varias clases para trabajar con fechas y horas.
LocalDateLa clase java.time.LocalDate representa una fecha sin zona horaria en el calendario ISO-8601, como 2007-12-03:
LocalDate date = LocalDate.of(2007, 12, 3);
Las fechas se pueden comparar con otras fechas:
LocalDate date1 = LocalDate.of(2007, 12, 3);
LocalDate date2 = LocalDate.of(2007, 12, 4);
date1.isBefore(date2);
// => true
date1.isAfter(date2);
// => false
Una instancia de LocalDate tiene getters para obtener sus partes de tiempo:
LocalDate date = LocalDate.of(2007, 12, 3);
date.getYear();
// => 2007
date.getMonthValue();
// => 12
date.getDayOfMonth();
// => 3
Una instancia de LocalDate tiene métodos para agregarle unidades de tiempo.
Estos métodos devuelven una instancia nueva de LocalDate y no actualizan la instancia existente, ya que la clase LocalDate es inmutable.
LocalDate date = LocalDate.of(2007, 12, 3);
date.plusDays(3);
// => 2007-12-06
date.plusMonths(1);
// => 2008-01-03
date.plusYears(1);
// => 2008-12-03
LocalDateTimeLa clase java.time.LocalDateTime representa una fecha y hora sin zona horaria en el calendario ISO-8601, como 2007-12-03T10:15:30:
LocalDateTime datetime = LocalDateTime.of(2007, 12, 3, 10, 15, 30);
datetime.getYear();
// => 2007
datetime.getMonthValue();
// => 12
datetime.getDayOfMonth();
// => 3
datetime.getHours();
// => 10
datetime.getMinutes();
// => 15
datetime.getSeconds();
// => 30
Al igual que la clase LocalDate, una instancia de LocalDateTime tiene los mismos métodos para compararla con otros LocalDateTime y para agregarle unidades de tiempo.
También es posible convertir una instancia de LocalDate en una de LocalDateTime:
LocalDate date = LocalDate.of(2007, 12, 3);
LocalDateTime datetime = date.atTime(10, 15, 30);
datetime.toString();
// => "2007-12-03T10:15:30"
Tanto LocalDate como LocalDateTime usan la notación estándar ISO-8601 al convertir desde y hacia un String.
LocalDateTime datetime = LocalDateTime.of(2007, 12, 3, 10, 15, 30);
LocalDateTime parsed = LocalDateTime.parse("2007-12-03T10:15:30");
datetime.isEqual(parsed);
// => true
No es posible parsear una LocalDate o LocalDateTime desde un String así, usando un formato diferente.
En su lugar, para formatear fechas con un formato personalizado, debes usar java.time.format.DateTimeFormatter:
DateTimeFormatter parser = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date = LocalDate.parse("03/12/2007", formatter);
DateTimeFormatter printer = DateTimeFormatter.ofPattern("MMMM d, yyyy");
printer.format(date);
// => "December 3, 2007"
También puedes especificar un locale al crear el formato personalizado, para formatear y parsear según distintas regiones:
DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.FRENCH).format(date);
// => décembre 3, 2007
DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.of("pt")).format(date);
// => dezembro 3, 2007