apuntes:fechas
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
apuntes:fechas [2019/02/10 20:53] – created Santiago Faci | apuntes: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 '' | ||
+ | |||
+ | <code java> | ||
+ | // La fecha de hoy | ||
+ | LocalDate fechaHoy = LocalDate.now(); | ||
+ | |||
+ | // Una fecha concreta | ||
+ | LocalDate fecha = LocalDate.of(2018, | ||
+ | System.out.println(fecha); | ||
+ | |||
+ | DayOfWeek dia = fecha.getDayOfWeek(); | ||
+ | Month mes = fecha.getMonth(); | ||
+ | int diaDelMes = fecha.getDayOfMonth(); | ||
+ | int numeroMes = fecha.getMonthValue(); | ||
+ | int numeroAno = fecha.getYear(); | ||
+ | </ | ||
+ | |||
+ | ==== LocalTime ==== | ||
+ | |||
+ | La clase '' | ||
+ | |||
+ | <code java> | ||
+ | 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 | ||
+ | |||
+ | <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); | ||
+ | </ | ||
+ | |||
+ | 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(" | ||
+ | |||
+ | System.out.println(diaSemana.getDisplayName(TextStyle.FULL, | ||
+ | System.out.println(diaSemana.getDisplayName(TextStyle.NARROW, | ||
+ | System.out.println(diaSemana.getDisplayName(TextStyle.SHORT, | ||
+ | </ | ||
+ | |||
+ | ==== 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); | ||
+ | // Hace dos meses | ||
+ | mes = mes.minus(2); | ||
+ | System.out.println(mes); | ||
+ | </ | ||
+ | |||
+ | 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(" | ||
+ | |||
+ | System.out.println(mes.getDisplayName(TextStyle.FULL, | ||
+ | System.out.println(mes.getDisplayName(TextStyle.NARROW, | ||
+ | System.out.println(mes.getDisplayName(TextStyle.SHORT, | ||
+ | </ | ||
+ | |||
+ | ===== 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(" | ||
+ | System.out.println(fechaHoy.minus(Period.ofWeeks(3))); | ||
+ | System.out.println(fechaHoy.plus(Period.ofDays(35))); | ||
+ | </ | ||
+ | |||
+ | === 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(" | ||
+ | |||
+ | === Parsear una fecha === | ||
+ | |||
+ | // Pasa la representación en String a un valor de fecha | ||
+ | LocalDate.parse(cadenaFecha, | ||
+ | </ | ||
+ | |||
+ | Se pueden ver más ejemplos de formatos de fecha y patrones en la API de Java correspondiente a | ||
+ | la [[https:// | ||
+ | |||
+ | === Comparar dos fechas === | ||
+ | |||
+ | También es posible comparar dos fechas entre ellas directamente para saber cuál es anterior/ | ||
+ | |||
+ | <code java> | ||
+ | LocalDate fechaHoy = LocalDate.now(); | ||
+ | LocalDate fechaAyer = LocalDate.now().minus(Period.ofDays(1)); | ||
+ | |||
+ | System.out.println(fechaHoy.isAfter(fechaAyer)); | ||
+ | System.out.println(fechaHoy.isBefore(fechaAyer)); | ||
+ | System.out.println(fechaHoy.equals(fechaAyer)); | ||
+ | </ | ||
+ | |||
+ | De forma muy similar, podremos realizar estas mismas operaciones con horas utilizando el tipo de datos '' | ||
+ | |||
+ | 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()); | ||
+ | </ | ||
+ | |||
+ | ==== Conversiones de fechas (Date <-> LocalDate) ==== | ||
+ | |||
+ | === De java.util.Date a LocalDate === | ||
+ | |||
+ | <code java> | ||
+ | fechaDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() | ||
+ | </ | ||
+ | |||
+ | === De java.util.Date a LocalDateTime === | ||
+ | |||
+ | <code java> | ||
+ | Instant.ofEpochMilli(fechaDate.getTime()) | ||
+ | .atZone(ZoneId.systemDefault()) | ||
+ | .toLocalDateTime(); | ||
+ | </ | ||
+ | |||
+ | === De LocalDateTime a java.util.Date === | ||
+ | |||
+ | <code java> | ||
+ | java.util.Date.from(fechaLocalDateTime | ||
+ | .atStartOfDay() | ||
+ | .atZone(ZoneId.systemDefault()) | ||
+ | .toInstant(); | ||
+ | </ | ||
+ | |||
+ | === De LocalDate a java.util.Date === | ||
+ | |||
+ | <code java> | ||
+ | java.util.Date.from(fechaLocalDate.atZone(ZoneId.systemDefault()) | ||
+ | .toInstant(); | ||
+ | </ | ||
+ | |||
+ | === De LocalDate a java.sql.Date === | ||
+ | |||
+ | <code java> | ||
+ | java.sql.Date.valueOf(localDate); | ||
+ | </ | ||
+ | |||
+ | === De java.sql.Date a LocalDate === | ||
+ | |||
+ | <code java> | ||
+ | LocalDate localDate = new java.sql.Date(date.getTime()).toLocalDate(); | ||
+ | </ | ||
+ | |||
+ | === De java.sql.Date a java.util.Date === | ||
+ | |||
+ | <code java> | ||
+ | java.util.Date fechaUtilDate = new java.util.Date(fechaSqlDate.getTime()); | ||
+ | </ | ||
+ | |||
+ | === De java.util.Date a java.sql.Date === | ||
+ | |||
+ | <code java> | ||
+ | java.sql.Date fechaSqlDate = new java.sql.Date(fechaUtilDate.getTime()); | ||
+ | </ | ||
---- | ---- | ||
- | (c) 2019 Santiago Faci | + | (c) 2019-{{date> |
apuntes/fechas.1549832021.txt.gz · Last modified: 2019/02/10 20:53 by Santiago Faci