Table of Contents
Fecha y hora
En este tema veremos la nueva API para gestión de fechas que se introdujo en Java 8. Comprenden clases y métodos para almacenar valores de fechas y poder trabajar con ellos. Les echaremos un vistazo a los tipos y operaciones más comunes para trabajar con fechas y períodos de tiempo.
Tipos para almacenar fechas
LocalDate
La clase LocalDate
permite almacenar el valor de una fecha sin hora de la que podremos extraer los partes de fecha que podamos necesitar mediante métodos getter.
// La fecha de hoy LocalDate fechaHoy = LocalDate.now(); // Una fecha concreta LocalDate fecha = LocalDate.of(2018, Month.NOVEMBER, 26); System.out.println(fecha); // 2018-11-26 DayOfWeek dia = fecha.getDayOfWeek(); Month mes = fecha.getMonth(); int diaDelMes = fecha.getDayOfMonth(); int numeroMes = fecha.getMonthValue(); int numeroAno = fecha.getYear();
LocalTime
La clase LocalTime
permite almacenar horas (hora, minuto y segundo). El funcionamiento es similar a la clase LocalDate
:
LocalTime ahora = LocalTime.now(); int hora = ahora.getHour(); int minutos = ahora.getMinute(); int segundos = ahora.getSecond();
DayOfWeek
Esta enumeración permite almacenar valores que representan el día de la semana
// Podemos almacenar un día de la semana DayOfWeek diaSemana = DayOfWeek.MONDAY; // El día siguiente diaSemana = diaSemana.plus(1); // Hace dos días diaSemana = diaSemana.minus(2);
También podemos obtener su representación por pantalla en función de la configuración de idioma de nuestra aplicación:
DayOfWeek diaSemana = DayOfWeek.FRIDAY; Locale locale = new Locale("es", "ES"); System.out.println(diaSemana.getDisplayName(TextStyle.FULL, locale)); // viernes System.out.println(diaSemana.getDisplayName(TextStyle.NARROW, locale)); // V System.out.println(diaSemana.getDisplayName(TextStyle.SHORT, locale)); // vie
Month
Esta enumeración permite almacenar valores que representan un mes
// Podemos almacenar un mes Month mes = Month.NOVEMBER; // Dentro de dos meses mes = Month.NOVEMBER; mes = mes.plus(3); System.out.println(mes); // FEBRUARY // Hace dos meses mes = mes.minus(2); System.out.println(mes); // DECEMBER
También podemos obtener su representación por pantalla en función de la configuración de idioma de nuestra aplicación:
Month mes = Month.NOVEMBER; Locale locale = new Locale("es", "ES"); System.out.println(mes.getDisplayName(TextStyle.FULL, locale)); // noviembre System.out.println(mes.getDisplayName(TextStyle.NARROW, locale)); // N System.out.println(mes.getDisplayName(TextStyle.SHORT, locale)); // nov
Operaciones con fechas
Como hemos dicho, además de proporcionar los tipos de datos y estructuras para almacenar valores de fecha y sus partes, la nueva API de fechas de Java también proporciona métodos para realizar operaciones con estos datos.
LocalDate fechaHoy = LocalDate.now(); System.out.println("Este año es bisiesto?: " + fechaHoy.isLeapYear()); // false System.out.println(fechaHoy.minus(Period.ofWeeks(3))); // 2018-11-03 System.out.println(fechaHoy.plus(Period.ofDays(35))); // 2018-12-29
Formatear una fecha
También se puede formatear el valor de la fecha para que pueda ser representado como una cadena de texto y viceversa:
// Pasa la fecha a una representación en String String cadenaFecha = fechaHoy.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")); === Parsear una fecha === // Pasa la representación en String a un valor de fecha LocalDate.parse(cadenaFecha, DateTimeFormatter.ofPattern("dd/MM/yyyy"));
Se pueden ver más ejemplos de formatos de fecha y patrones en la API de Java correspondiente a la clase DateTimeFormatter
Comparar dos fechas
También es posible comparar dos fechas entre ellas directamente para saber cuál es anterior/posterior o si son iguales
LocalDate fechaHoy = LocalDate.now(); LocalDate fechaAyer = LocalDate.now().minus(Period.ofDays(1)); System.out.println(fechaHoy.isAfter(fechaAyer)); // true System.out.println(fechaHoy.isBefore(fechaAyer)); // false System.out.println(fechaHoy.equals(fechaAyer)); // false
De forma muy similar, podremos realizar estas mismas operaciones con horas utilizando el tipo de datos LocalTime
que hemos visto más arriba.
Y saber cuál es la distancia entre dos fechas determinadas:
LocalDate fechaHoy = LocalDate.now(); LocalDate fechaAyer = LocalDate.now().minus(Period.ofDays(1)); // Una vez calculada la distancia entre las fechas Period periodo = fechaHoy.until(fechaAyer); // Puedo verla en dias, meses, . . . System.out.println(periodo.getDays()); // -1
Conversiones de fechas (Date <-> LocalDate)
De java.util.Date a LocalDate
fechaDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()
De java.util.Date a LocalDateTime
Instant.ofEpochMilli(fechaDate.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDateTime();
De LocalDateTime a java.util.Date
java.util.Date.from(fechaLocalDateTime .atStartOfDay() .atZone(ZoneId.systemDefault()) .toInstant();
De LocalDate a java.util.Date
java.util.Date.from(fechaLocalDate.atZone(ZoneId.systemDefault()) .toInstant();
De LocalDate a java.sql.Date
java.sql.Date.valueOf(localDate);
De java.sql.Date a LocalDate
LocalDate localDate = new java.sql.Date(date.getTime()).toLocalDate();