Programación

1º DAM/DAW - Curso 2023-2024

User Tools

Site Tools


apuntes:fechas

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();

De java.sql.Date a java.util.Date

java.util.Date fechaUtilDate = new java.util.Date(fechaSqlDate.getTime());

De java.util.Date a java.sql.Date

java.sql.Date fechaSqlDate = new java.sql.Date(fechaUtilDate.getTime());

© 2019-2024 Santiago Faci

apuntes/fechas.txt · Last modified: 2023/06/04 21:18 by Santiago Faci