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

Both sides previous revisionPrevious revision
Next revision
Previous revision
apuntes:fechas [2019/02/14 22:12] 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 ======
  
-\part*{Fecha y hora en Java 8}+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.
  
-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 +===== Tipos para almacenar fechas =====
-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.+
  
-\section{Tipos para almacenar fechas}+==== LocalDate ====
  
-\subsection{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 clase \verb LocalDate  permite almacenar el valor de una fecha sin hora de la que podremos extraer los partes de fecha que podamos +<code java>
-necesitar mediante métodos \emph{getter}. +
- +
-\begin{lstlisting}[language=java]+
 // La fecha de hoy // La fecha de hoy
 LocalDate fechaHoy = LocalDate.now(); LocalDate fechaHoy = LocalDate.now();
Line 27: Line 22:
 int numeroMes = fecha.getMonthValue(); int numeroMes = fecha.getMonthValue();
 int numeroAno = fecha.getYear(); int numeroAno = fecha.getYear();
-\end{lstlisting}+</code>
  
-\subsection{LocalTime}+==== LocalTime ====
  
-La clase \verb LocalTime  permite almacenar horas (hora, minuto y segundo). El funcionamiento es similar a la clase \verb LocalDate :+La clase ''LocalTime'' permite almacenar horas (hora, minuto y segundo). El funcionamiento es similar a la clase ''LocalDate'':
  
-\begin{lstlisting}[language=java]+<code java>
 LocalTime ahora = LocalTime.now(); LocalTime ahora = LocalTime.now();
  
Line 39: Line 34:
 int minutos = ahora.getMinute(); int minutos = ahora.getMinute();
 int segundos = ahora.getSecond(); int segundos = ahora.getSecond();
-\end{lstlisting}+</code>
  
-\subsection{DayOfWeek}+==== DayOfWeek ====
  
 Esta enumeración permite almacenar valores que representan el día de la semana Esta enumeración permite almacenar valores que representan el día de la semana
  
-\begin{lstlisting}[language=java]+<code java>
 // Podemos almacenar un día de la semana // Podemos almacenar un día de la semana
 DayOfWeek diaSemana = DayOfWeek.MONDAY; DayOfWeek diaSemana = DayOfWeek.MONDAY;
Line 53: Line 48:
 // Hace dos días // Hace dos días
 diaSemana = diaSemana.minus(2); diaSemana = diaSemana.minus(2);
-\end{lstlisting}+</code>
  
 También podemos obtener su representación por pantalla en función de la configuración de idioma de nuestra aplicación: También podemos obtener su representación por pantalla en función de la configuración de idioma de nuestra aplicación:
  
-\begin{lstlisting}[language=java]+<code java>
 DayOfWeek diaSemana = DayOfWeek.FRIDAY; DayOfWeek diaSemana = DayOfWeek.FRIDAY;
 Locale locale = new Locale("es", "ES"); Locale locale = new Locale("es", "ES");
Line 64: Line 59:
 System.out.println(diaSemana.getDisplayName(TextStyle.NARROW, locale)); // V System.out.println(diaSemana.getDisplayName(TextStyle.NARROW, locale)); // V
 System.out.println(diaSemana.getDisplayName(TextStyle.SHORT, locale));  // vie System.out.println(diaSemana.getDisplayName(TextStyle.SHORT, locale));  // vie
-\end{lstlisting}+</code>
  
-\subsection{Month}+==== Month ====
  
 Esta enumeración permite almacenar valores que representan un mes Esta enumeración permite almacenar valores que representan un mes
  
-\begin{lstlisting}[language=java]+<code java>
 // Podemos almacenar un mes // Podemos almacenar un mes
 Month mes = Month.NOVEMBER; Month mes = Month.NOVEMBER;
Line 81: Line 76:
 mes = mes.minus(2); mes = mes.minus(2);
 System.out.println(mes);    // DECEMBER System.out.println(mes);    // DECEMBER
-\end{lstlisting}+</code>
  
 También podemos obtener su representación por pantalla en función de la configuración de idioma de nuestra aplicación: También podemos obtener su representación por pantalla en función de la configuración de idioma de nuestra aplicación:
  
-\begin{lstlisting}[language=java]+<code java>
 Month mes = Month.NOVEMBER; Month mes = Month.NOVEMBER;
 Locale locale = new Locale("es", "ES"); Locale locale = new Locale("es", "ES");
Line 92: Line 87:
 System.out.println(mes.getDisplayName(TextStyle.NARROW, locale)); // N System.out.println(mes.getDisplayName(TextStyle.NARROW, locale)); // N
 System.out.println(mes.getDisplayName(TextStyle.SHORT, locale));  // nov System.out.println(mes.getDisplayName(TextStyle.SHORT, locale));  // nov
-\end{lstlisting}+</code>
  
-\section{Operaciones con fechas}+===== 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 +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.
-fechas de Java también proporciona métodos para realizar operaciones con estos datos.+
  
-\begin{lstlisting}[language=java]+<code java>
 LocalDate fechaHoy = LocalDate.now(); LocalDate fechaHoy = LocalDate.now();
 System.out.println("Este año es bisiesto?: " + fechaHoy.isLeapYear()); // false 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.minus(Period.ofWeeks(3)));  // 2018-11-03
 System.out.println(fechaHoy.plus(Period.ofDays(35)));   // 2018-12-29 System.out.println(fechaHoy.plus(Period.ofDays(35)));   // 2018-12-29
-\end{lstlisting}+</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: También se puede formatear el valor de la fecha para que pueda ser representado como una cadena de texto y viceversa:
  
-\begin{lstlisting}[language=java]+<code java>
 // Pasa la fecha a una representación en String // Pasa la fecha a una representación en String
 String cadenaFecha = fechaHoy.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")); String cadenaFecha = fechaHoy.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
 +
 +=== Parsear una fecha ===
  
 // Pasa la representación en String a un valor de fecha // Pasa la representación en String a un valor de fecha
 LocalDate.parse(cadenaFecha, DateTimeFormatter.ofPattern("dd/MM/yyyy")); LocalDate.parse(cadenaFecha, DateTimeFormatter.ofPattern("dd/MM/yyyy"));
-\end{lstlisting}+</code>
  
 Se pueden ver más ejemplos de formatos de fecha y patrones en la API de Java correspondiente a  Se pueden ver más ejemplos de formatos de fecha y patrones en la API de Java correspondiente a 
-la \href{https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html}{clase DateTimeFormatter}+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 También es posible comparar dos fechas entre ellas directamente para saber cuál es anterior/posterior o si son iguales
  
-\begin{lstlisting}[language=java]+<code java>
 LocalDate fechaHoy = LocalDate.now(); LocalDate fechaHoy = LocalDate.now();
 LocalDate fechaAyer = LocalDate.now().minus(Period.ofDays(1)); LocalDate fechaAyer = LocalDate.now().minus(Period.ofDays(1));
Line 128: Line 128:
 System.out.println(fechaHoy.isBefore(fechaAyer));   // false System.out.println(fechaHoy.isBefore(fechaAyer));   // false
 System.out.println(fechaHoy.equals(fechaAyer));     // false System.out.println(fechaHoy.equals(fechaAyer));     // false
-\end{lstlisting}+</code>
  
-De forma muy similar, podremos realizar estas mismas operaciones con horas utilizando el tipo de datos \verb LocalTime  que hemos visto más +De forma muy similar, podremos realizar estas mismas operaciones con horas utilizando el tipo de datos ''LocalTime'' que hemos visto más arriba.
-arriba.+
  
 Y saber cuál es la distancia entre dos fechas determinadas: Y saber cuál es la distancia entre dos fechas determinadas:
  
-\begin{lstlisting}[language=java]+<code java>
 LocalDate fechaHoy = LocalDate.now(); LocalDate fechaHoy = LocalDate.now();
 LocalDate fechaAyer = LocalDate.now().minus(Period.ofDays(1)); LocalDate fechaAyer = LocalDate.now().minus(Period.ofDays(1));
Line 143: Line 142:
 // Puedo verla en dias, meses, . . . // Puedo verla en dias, meses, . . .
 System.out.println(periodo.getDays());      // -1 System.out.println(periodo.getDays());      // -1
-\end{lstlisting}+</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.1550182364.txt.gz · Last modified: 2019/02/14 22:12 by Santiago Faci