¿Conoces LocalTime o LocalDateTime? Prepárate para profundizar en las variables del tipo date en Java con ejemplos prácticos y útiles.

Las fechas en Java: todo lo que debes saber sobre las variables tipo date

antonio.gutierrez
14/10/2024

Java es un lenguaje de programación que ha ido avanzando y mejorando con el tiempo. Un ejemplo de ello son las clases para el manejo de fechas java.util.Date y java.util.Calendar, existentes desde el inicio de los tiempos. Sin embargo, estas clases no son las más adecuadas para manejar las fechas en Java. Por ello, En Educa Open nos vamos a centrar en las variables del tipo date.

El paquete java.time es una buena alternativa para manejar las fechas en Java, aunque cuenta con ciertas singularidades y variables que debes tener en cuenta. ¿Conoces LocalTime o LocalDateTime? Prepárate porque vamos a profundizar en este aspecto, de manera que cierres este artículo con toda la información necesaria. Si, aun así, quieres seguir aprendiendo sobre Java, te recomendamos el Curso Superior en Programación Frontend con Javascript Angular.

¿Qué es date en Java?

El manejo de las fechas en Java resulta de gran importancia para muchas aplicaciones, ya que es la única manera de registrar y gestionar eventos cronológicos. Como decimos. la clase Date en Java está presente desde las primeras versiones del lenguaje, permitiendo representar un punto en el tiempo (milisegundos desde el 1 de enero de 1970, 00:00:00 GMT).

Aun así, las versión más recientes de Java han reemplazado la clase Date por las clases del paquete java.time. ¿Por qué? Porque su funcionalidad se vio limitada por ciertas inconsistencias, como la falta de soporte directo para zonas horas. Por ello, se introdujeron nuevas clases en Java 8, como LocalDate, LocalTime y LocalDateTime, que proporcionan una mayor precisión y control sobre las operaciones de fecha.

¿Cómo sacar la fecha en Java?

Sacar la fecha actual en Java es un proceso sencillo, ya que tan solo tenemos que utilizar la clase LocalDate del paquete java.time. Este método permite obtener la fecha actual del sistema de forma eficiente. Aquí te mostramos un ejemplo de cómo hacerlo:

import java.time.LocalDate;

public class DateExample {

public static void main(String[] args) {

LocalDate today = LocalDate.now();

System.out.println("Today's Date: " + today);

}

}

Como vemos en este código, existe un método now() en la clase LocalDate. Este nos devuelve la fecha actual en el formato yyyy-mm-dd, que es el formato estándar en Java. Si queremos obtener la hora también, deberemos recurrir a la clase LocalDateTime.

Como se aprecia, este método es más moderno que la clase Date, ya que proporciona una mayor flexibilidad y compatibilidad con los date time formats java.

¿Cómo declarar una variable de tipo date en Java?

Declarar una variable de tipo Date en Java es muy simple, pero, eso sí, tienes que saber qué clase de fecha necesitas utilizar en tu proyecto. Por ejemplo, en este proyecto se usa el paquete de java.util, que declara una variable de tipo Date y la empieza con la fecha y hora actuales.

import java.util.Date;

public class DateDeclaration {

public static void main(String[] args) {

 Date date = new Date(); // Fecha actual

System.out.println("Fecha actual: " + date);

}

}

El valor representado por esta fecha será impreso en formato de cadena, incluyendo información de hora y minuto. Sin embargo, ya sabemos que la clase Date tiene ciertas limitaciones, por lo que recomendamos optar por las nuevas clases del paquete java.time, que cuenta con una mayor precisión y control. Quedaría tal que así con la clase LocalDate.

import java.time.LocalDate;

public class LocalDateExample {

public static void main(String[] args) {

LocalDate localDate = LocalDate.of(2023, 10, 12); // Año, mes y día

System.out.println("Fecha: " + localDate);

}

}

Aquí se especifican los valores de año, mes y día. Además, el uso de formatter java date facilita el parsing date y su transformación en diferentes formatos.

El paquete java.time, en profundidad

Ahora toca adentrarse de lleno en el paquete java.time. Como hemos dicho, fue introducido en Java 8 para mejorar la manipulación de fechas y horas, resolviendo las limitaciones de las clases Date y Calendar. En este paquete se incluyen clases como LocalDate, LocalTime, LocalDateTime y ZonedDateTime, cada una diseñada para un objetivo en concreto.

El paquete java.time se basa en los principios de inmutabilidad y claridad, permitiendo una manipulación más precisa y segura de las fechas y horas en aplicaciones de Java. Además, su formato genera un uso más intuitivo y moderno, facilitando la lectura, escritura y transformación de fechas en diversos formatting date java.

LocalDate

La clase LocalDate es la principal herramienta en java.time, y es que permite trabajar con fechas sin necesidad de gestionar zonas horarias ni tiempos específicos. Esta clase es muy útil para almacenar eventos que solo requieren información de fecha, además de que se puede obtener la fecha actual mediante el método now().

También se pueden sumar o restar días, meses o años de una fecha utilizando métodos como plusDays() o minusMonths(). Por otro lado, se pueden comparar fechas usando métodos como isBefore() o isAfter(). Aquí te dejamos un ejemplo de cómo sumar días a una fecha:

LocalDate today = LocalDate.now();

LocalDate futureDate = today.plusDays(10); // Sumar 10 días

System.out.println("Fecha futura: " + futureDate);

De esta manera, se pueden manipular plazos o eventos programados en fechas específicas sin necesidad de recurrir a componentes de tiempo como hour minute o hh mm ss.

LocalTime

LocalTime es otra clase del paquete java.time que permite manejar el tiempo sin asociarse a una fecha específica., puesto que solo contiene información sobre horas, minutos, segundos y nanosegundos. Así, es ideal para situaciones en las que solo se necesita registrar tiempos sin preocuparse por el día, como en horarios de apertura,

Aquí tenemos un ejemplo:

LocalTime time = LocalTime.of(14, 30); // Hora: 14:30

System.out.println("Hora: " + time);

LocalDateTime

La clase LocalDateTime combina tanto la fecha como la hora en un solo objetivo, siendo una de las clases más versátiles en java.time. ¿Por qué? Porque incluye tanto las funcionalidades de LocalDate como de LocalTime, manejando tanto la fecha como el tiempo sin incluir la zona horaria.

Aquí te dejamos un ejemplo de LocalDateTime con el método of() para definir tanto la fecha como la hora.

LocalDateTime dateTime = LocalDateTime.of(2023, 10, 12, 14, 30); // Año, mes, día, hora y minuto

System.out.println("Fecha y hora: " + dateTime);

Instant

Instant es una clase en Java para representar un momento específico en la línea de tiempo, medido en nanosegundos desde el 1 de enero de 1970, 00:00:00 GMT. Lo diferente es que se trabaja con un concepto universal de tiempo (UTC), ideal para operaciones en las que se requiere una precisión temporal muy alta.

Aquí te dejamos un pequeño ejemplo:

Instant instant = Instant.now(); // Fecha y hora actuales en formato UTC

System.out.println("Instantáneo: " + instant);

ZonedDateTime

La clase ZonedDateTime mezcla la funcionalidad de LocalDateTime con el manejo de zonas horarias, lo que nos deja trabajar con fechas y horas en diferentes ubicaciones. Para las aplicaciones internacionales, los eventos ocurren en diferentes zonas horarios, por lo que se necesitan conversiones automáticas.

Este es un ejemplo de cómo crear un ZonedDateTime:

ZonedDateTime zonedDateTime = ZonedDateTime.now();

System.out.println("Fecha y hora con zona: " + zonedDateTime);

Period

Period es otra clase importante en Java para representar un intervalo de tiempo en términos de años, meses y días. Sobre todo, se utiliza cuando se desea calcular la diferencia entre dos fechas sin tener en cuenta las horas o los segundos. Así, un Period se puede crear muy fácil usando el método between().

LocalDate startDate = LocalDate.of(2020, 1, 1);

LocalDate endDate = LocalDate.now();

Period period = Period.between(startDate, endDate);

System.out.println("Diferencia: " + period.getYears() + " años");

Duration

Duration está diseñada para representar un intervalo de tiempo, pero en términos de horas, minutos, segundos y nanosegundos. Su diferencia con Period radica en que está orientada a medir lapsos de tiempo más cortos y específicos, como, por ejemplo, una llamada telefónica.

Así puedes crear una Duration:

LocalTime startTime = LocalTime.of(10, 0);

LocalTime endTime = LocalTime.of(12, 30);

Duration duration = Duration.between(startTime, endTime);

System.out.println("Duración: " + duration.toHours() + " horas");

Partes de una fecha o una hora

En Java, una fecha o hora se compone de varias partes. Por ejemplo, en la clase LocalDate, puedes obtener el año, mes y día de una fecha específica usando métodos como getYear(), getMonthValue y getDayofMonth(). Aquí te dejamos un ejemplo:

LocalDate date = LocalDate.now();

int year = date.getYear();

int month = date.getMonthValue();

int day = date.getDayOfMonth();

System.out.println("Año: " + year + ", Mes: " + month + ", Día: " + day);

De igual manera se puede hacer con las partes de una hora, como hora, minuto y segundo. En este caso, se usan métodos como getHour(), getMinute() y getSecond().

LocalTime time = LocalTime.now();

int hour = time.getHour();

int minute = time.getMinute(); 

System.out.println("Hora: " + hour + ", Minuto: " + minute);

Transformar fechas y horas

Esta es una duda común, puesto que transformar fechas y horas en Java es una de las tareas más recurrentes. Sin embargo, completar esta misión es realmente fácil cuando se usan clases como LocalDate, LocalTime, LocalDateTime y ZonedDateTime.

Por ejemplo, para transformar un objeto de LocalDate a un LocalDateTime simplemente se puede combinar una fecha con un tiempo mediante el método atTime().

LocalDate date = LocalDate.now();

LocalDateTime dateTime = date.atTime(14, 30);

System.out.println("Fecha y hora: " + dateTime);

De igual manera, para transformar una fecha a un formato de cadena específico puedes usar DateTimeFormatter, que te permite definir el formato deseado y luego aplicarlo a la fecha u hora.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");

String formattedDate = date.format(formatter);

System.out.println("Fecha formateada: " + formattedDate);

Ajustes temporales

Los ajustes temporales se usan en Java para modificar fechas o tiempos de acuerdo con ciertas reglas predefinidas. Como ya hemos visto, se pueden sumar o restar días, semanas, meses o años con una clase de métodos. Sin embargo, también se pueden realizar ajustes basados en días específicos del mes o del año. Por ejemplo, ajustar una fecha para que caiga en el último día del mes usando el método withDayOfMonth().

LocalDate endOfMonth = today.withDayOfMonth(today.lengthOfMonth());

System.out.println("Último día del mes: " + endOfMonth);

Formato personalizado de fechas

El formato de las fechas también se puede personalizar en Java usando la clase DateTimeFormatter, que deja definir formatos específicos para convertir horas y fechas. Por ejemplo, si quieres formatear una fecha en el formato dd-mm-yyyy, puedes usar el siguiente código:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");

LocalDate date = LocalDate.now();

String formattedDate = date.format(formatter);

System.out.println("Fecha en formato personalizado: " + formattedDate);

Hay proyectos en los que se necesita presentar fechas de una manera específica, como en informes o en aplicaciones en las que los usuarios viven en diferentes regiones con formatos distintos. Por ello, no te debes olvidar de DateTimeFormatter.

Ejemplos prácticos

Para cerrar este post, no se nos ocurre mejor manera que aportarte una serie de ejemplos prácticos sobre cómo utilizar las clases y métodos del paquete java.time.

Obtener la fecha y hora actuales

Este sería un ejemplo simple de cómo obtener la fecha y hora actuales utilizando LocalDateTime:

import java.time.LocalDateTime;

public class DateTimeExample {

public static void main(String[] args) {

LocalDateTime currentDateTime = LocalDateTime.now();

System.out.println("Fecha y hora actuales: " + currentDateTime);

}

}

Formatear una fecha

A continuación, te mostramos cómo formatear una fecha usando DateTimeFormatter:

import java.time.LocalDate;

import java.time.format.DateTimeFormatter;

public class FormatDateExample {

public static void main(String[] args) {

LocalDate date = LocalDate.now();

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); 

String formattedDate = date.format(formatter);

System.out.println("Fecha formateada: " + formattedDate); } }

Calcular la diferencia entre dos fechas

Aquí, usamos Period para calcular la diferencia en años, meses y días entre dos fechas distintas:

import java.time.LocalDate;

import java.time.Period;

public class PeriodExample { 

public static void main(String[] args) {

LocalDate startDate = LocalDate.of(2020, 1, 1);

LocalDate endDate = LocalDate.now();

Period period = Period.between(startDate, endDate);

System.out.println("Han pasado " + period.getYears() + " años, "

period.getMonths() + " meses, y " + period.getDays() + " días.");

}

}

Trabajar con zonas horarias

Para terminar, te dejamos un ejemplo de cómo trabajar con ZonedDateTime para gestionar fechas y horas en diferentes zonas horarias:

import java.time.ZonedDateTime;

import java.time.ZoneId;

public class ZonedDateTimeExample {

public static void main(String[] args) {

ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("America/New_York"));

System.out.println("Fecha y hora en Nueva York: " + zonedDateTime);

}

}

 

Artículos relacionados

"¡Mi PC no enciende!". ¿Te sientes identificado? Desde EducaOpen, te contamos las posibles causas y soluciones.
cristina.polo

Mi PC no enciende: causas y soluciones

10/10/2024

¡Mi PC no enciende! Seguramente, en algún momento de tu vida, te has sentido identificado/a con esta afirmación y, además, desconocías la causa por la que tu orde

Si quieres aprender sobre programación de robots, estos son los lenguajes que debes conocer. ¡Confía en Educa Open!
cristina.polo

Programación de robots: estos son los lenguajes que debes conocer

07/10/2024

Aprender a hablar con las máquinas ha sido uno de los principales desafíos para los ingenieros/as de robótica en las últimas décadas.

Al igual que se hace con el resto de productos, los programas informáticos nuevos han de testearse. ¡Descubre todos los tipos de pruebas de software!
pablo.blanco

Tipos de pruebas de software

17/11/2023

Al igual que se hace con el resto de productos antes de lanzarlos al mercado, los programas y aplicaciones informáticas que se desarrollan también han de ponerse a p