Programación

1º DAM/DAW - Curso 2023-2024

User Tools

Site Tools


apuntes:fechas

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
apuntes:fechas [2019/02/10 20:53] – created Santiago Faciapuntes:fechas [2023/06/04 21:18] (current) – [Conversiones de fechas (Date <-> LocalDate)] Santiago Faci
Line 1: Line 1:
 ====== Fecha y hora ====== ====== 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//.
 +
 +<code java>
 +// 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();
 +</code>
 +
 +==== LocalTime ====
 +
 +La clase ''LocalTime'' permite almacenar horas (hora, minuto y segundo). El funcionamiento es similar a la clase ''LocalDate'':
 +
 +<code java>
 +LocalTime ahora = LocalTime.now();
 +
 +int hora = ahora.getHour();
 +int minutos = ahora.getMinute();
 +int segundos = ahora.getSecond();
 +</code>
 +
 +==== DayOfWeek ====
 +
 +Esta enumeración permite almacenar valores que representan el día de la semana
 +
 +<code java>
 +// 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);
 +</code>
 +
 +También podemos obtener su representación por pantalla en función de la configuración de idioma de nuestra aplicación:
 +
 +<code java>
 +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
 +</code>
 +
 +==== Month ====
 +
 +Esta enumeración permite almacenar valores que representan un mes
 +
 +<code java>
 +// 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
 +</code>
 +
 +También podemos obtener su representación por pantalla en función de la configuración de idioma de nuestra aplicación:
 +
 +<code java>
 +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
 +</code>
 +
 +===== 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.
 +
 +<code java>
 +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
 +</code>
 +
 +=== 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:
 +
 +<code java>
 +// 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"));
 +</code>
 +
 +Se pueden ver más ejemplos de formatos de fecha y patrones en la API de Java correspondiente a 
 +la [[https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html|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
 +
 +<code java>
 +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
 +</code>
 +
 +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:
 +
 +<code java>
 +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
 +</code>
 +
 +==== Conversiones de fechas (Date <-> LocalDate) ====
 +
 +=== De java.util.Date a LocalDate ===
 +
 +<code java>
 +fechaDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()
 +</code>
 +
 +=== De java.util.Date a LocalDateTime ===
 +
 +<code java>
 +Instant.ofEpochMilli(fechaDate.getTime()) 
 +  .atZone(ZoneId.systemDefault())
 +  .toLocalDateTime();
 +</code>
 +
 +=== De LocalDateTime a java.util.Date ===
 +
 +<code java>
 +java.util.Date.from(fechaLocalDateTime
 +  .atStartOfDay()
 +  .atZone(ZoneId.systemDefault())
 +  .toInstant();
 +</code>
 +
 +=== De LocalDate a java.util.Date ===
 +
 +<code java>
 +java.util.Date.from(fechaLocalDate.atZone(ZoneId.systemDefault()) 
 +  .toInstant();
 +</code>
 +
 +=== De LocalDate a java.sql.Date ===
 +
 +<code java>
 +java.sql.Date.valueOf(localDate);
 +</code>
 +
 +=== De java.sql.Date a LocalDate ===
 +
 +<code java>
 +LocalDate localDate = new java.sql.Date(date.getTime()).toLocalDate();
 +</code>
 +
 +=== De java.sql.Date a java.util.Date ===
 +
 +<code java>
 +java.util.Date fechaUtilDate = new java.util.Date(fechaSqlDate.getTime());
 +</code>
 +
 +=== De java.util.Date a java.sql.Date ===
 +
 +<code java>
 +java.sql.Date fechaSqlDate = new java.sql.Date(fechaUtilDate.getTime());
 +</code>
  
 ---- ----
  
-(c) 2019 Santiago Faci+(c) 2019-{{date>%Y}} Santiago Faci
apuntes/fechas.1549832021.txt.gz · Last modified: 2019/02/10 20:53 by Santiago Faci