Cómo obtener la fecha y hora actuales en Java

En este artículo, mostraremos las muchas formas en que puede obtener la fecha y la hora actuales en Java. Usando System.currentTimeMillis(), la clase java.util.Date, la nueva API de Fecha/Hora y Joda-Time.

Introducción

En este artículo, exploraremos muchas formas de Obtener la fecha y hora actual en Java. La mayoría de las aplicaciones tienen la necesidad de eventos de marca de tiempo o mostrar fecha/hora, entre muchos otros casos de uso:

  • Cuando publicamos blogs en un sitio web, la fecha de publicación se anota en una base de datos y se muestra al lector.
  • Cuando realizamos una acción, nos gustaría saber la hora en que estará disponible para poder realizar un seguimiento de ellos.
  • Cuando compramos algo en línea o hacemos una transacción, nuestros bancos nos ofrecen la lista de transacciones con las marcas de tiempo exactas para que las revisemos.

Para resumir, obtener la fecha y la hora actual en Java es muy importante y tiene una gran variedad de usos y, afortunadamente, es realmente fácil de obtener para cualquier tipo de uso.

System.currentTimeMillis()

Si desea obtener un solo valor numérico de milisegundos transcurridos desde la Época UNIX, es tan fácil como:

1
System.currentTimeMillis();

Imprimir este valor daría como resultado algo similar a esto:

1
1580897313933

Al convertir este número a una fecha legible por humanos, representa:

1
Wednesday, 5 February 2020 10:08:33.933

Y para hacer esto en Java, solo necesitamos un par de líneas de código:

1
2
3
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
Date date = new Date(System.currentTimeMillis());
System.out.println(formatter.format(date));

Ejecutar este fragmento de código produciría:

1
2020-02-05 at 10:11:33 UTC

Nota: Tenga en cuenta que este método devuelve el valor actual según la hora de su sistema.

java.util.Date

En Java, obtener la fecha actual es tan simple como instanciar el objeto Date del paquete Java java.util:

1
Date date = new Date(); // This object contains the current date value

Podemos formatear esta fecha fácilmente:

1
2
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
System.out.println(formatter.format(date));

Y ejecutar este fragmento de código produciría:

1
05-02-2020 10:12:46

La API de Calendario

Entre la miríada de clases de Java se encuentra la clase Calendar, que se utiliza para convertir fechas y horas entre instantes específicos y los campos del calendario.

Obtener la fecha y la hora actual es muy fácil usando un calendario:

1
Calendar calendar = Calendar.getInstance(); // Returns instance with current date and time set

Nuevamente, podemos formatear esto fácilmente:

1
2
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
System.out.println(formatter.format(calendar.getTime()));

El método getTime() devuelve un objeto Date. Dado que SimpleDateFormat solo funciona con objetos Date, estamos llamando al método getTime() de la clase Calendar para formatearlo.

Ejecutar este fragmento de código produciría:

1
25-11-2018 00:43:39

API de fecha y hora

Java 8 nos presentó una API completamente nueva, que se incluyó en la compilación para reemplazar java.util.Date y java.util.Calendar.

Todavía es útil saber cómo obtener la fecha y la hora actuales utilizando las dos clases anteriores, ya que no todas las aplicaciones han migrado aún a Java 8.

La API de fecha/hora proporciona varias clases en las que podemos confiar para realizar el trabajo:

Fecha local

LocalDate representa solo una fecha, sin tiempo. Esto significa que solo podemos obtener la fecha actual, pero sin la hora del día:

1
LocalDate date = LocalDate.now(); // Gets the current date

Esta vez, en lugar de inicializar un nuevo objeto, estamos llamando al método estático ahora() que devuelve la fecha actual de acuerdo con el reloj del sistema, con la zona horaria predeterminada.

Podemos formatear este objeto:

1
2
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
System.out.println(date.format(formatter));

Ejecutar este fragmento de código produciría:

1
05-02-2020

También puede pasar un ZoneId al método para recuperar la fecha según la zona horaria especificada, en lugar de la predeterminada:

1
LocalDate date = LocalDate.now(ZoneId.of("Europe/Paris")); // Gets current date in Paris

Puede obtener una lista de todos los ID de zona horaria disponibles a través de:

1
System.out.println(ZoneId.getAvailableZoneIds());

Hora local

LocalTime es lo contrario de LocalDate en el sentido de que representa solo una hora, sin la fecha. Esto significa que solo podemos obtener la hora actual del día, sin la fecha real:

1
LocalTime time = LocalTime.now(); // Gets the current time

Podemos formatear fácilmente este objeto:

1
2
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println(time.format(formatter));

Ejecutar este fragmento de código produciría:

1
00:55:58

Fecha y hora local

Y, por último, LocalDateTime, la clase de fecha/hora más utilizada en Java, representa la combinación de las dos anteriores, que contiene el valor de la fecha y la hora:

1
LocalDateTime dateTime = LocalDateTime.now(); // Gets the current date and time

Podemos formatear fácilmente este objeto:

1
2
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
System.out.println(dateTime.format(formatter));

Ejecutar este fragmento de código produciría:

1
05-02-2020 10:31:42

FechaHoraZonificada

Junto a las clases anteriores, la clase ZonedDateTime también ofrece esta funcionalidad:

1
ZonedDateTime dateTime = ZonedDateTime.now(); // Gets the current date and time, with your default time-zone

Podemos formatear fácilmente este objeto:

1
2
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
System.out.println(dateTime.format(formatter));

Ejecutar este fragmento de código produciría:

1
05-02-2020 10:32:26

Reloj

Otra clase que se nos presentó en la API de fecha/hora de Java 8 es la clase Clock. Proporciona acceso al Instant, LocalDate, LocalTime y LocalDateTime actuales usando una zona horaria.

Dicho esto, usando un ‘Reloj’, prácticamente creas una instancia de todos ellos y puedes acceder a los que te interesan.

1
2
3
4
5
// Clock with the system's default timezone
Clock clock = Clock.systemDefaultZone();

// Clock with the UTC timezone
Clock clock = Clock.systemUTC();

A través de esta instancia de objeto, podemos instanciar muchas de las clases mencionadas anteriormente:

1
2
3
4
5
6
// Each of these obtain the current instance of that class from the clock
LocalDateTime localDateTime = LocalDateTime.now(clock);
LocalTime localTime = LocalTime.now(clock);
LocalDate localDate = LocalDate.now(clock);
Instant instant = Instant.now(clock);
ZonedDateTime zonedDateTime.now(clock);

Nota: Es válido preguntar por qué usaríamos un ‘Reloj’ en lugar de simplemente dejar vacío el método ‘ahora()’. Un ‘Reloj’ es opcional y el método ‘ahora()’ generalmente usa el reloj del sistema para determinar los valores. Sin embargo, a través de un reloj puede tener más que solo el reloj de su sistema si así lo desea. Sin embargo, en nuestro ejemplo, no hace la diferencia.

Usando el reloj, podemos extraer un Instante:

1
2
Instant instant = clock.instant();
System.out.println(instant);

Ejecutar este código produciría:

1
2020-04-16T17:05:43.867063Z

Puede crear un Reloj dividido en zonas pasando un ZoneId a Clock.system():

1
Clock clock = Clock.system(ZoneId.of("Europe/Paris"));

Imprimir el valor del Instant perteneciente a clock produciría:

1
2020-04-16T17:08:16.139183Z

Y finalmente, usando un Reloj, a través del método millis(), puedes acceder al valor de milisegundos del reloj, que es lo mismo que System.currentTimeMillis():

1
2
System.out.println(clock.millis());
System.out.println(System.currentTimeMillis());

Ambos se imprimirán:

1
2
1587057153329
1587057153329

Joda-Tiempo

Joda-Tiempo es una herramienta que se desarrolló originalmente para contrarrestar los problemas con las antiguas clases de fecha y hora de Java.

Con el lanzamiento de Java 8, estos problemas se han abordado y Joda-Time ha cumplido su propósito, sin que se use con mucha frecuencia en la actualidad.

Nuevamente, si su proyecto no está actualizado a Java 8, Joda-Time sigue siendo una excelente herramienta para usar como alternativa.

Para usarlo en su proyecto, es más fácil simplemente agregar una dependencia Experto:

1
2
3
4
5
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>${version}</version>
</dependency>

Trabajar con Joda-Time es muy similar a trabajar con la API de fecha/hora de Java:

1
DateTime dateTime = new DateTime(); // Initializes with the current date and time

Nota: Al inicializar la clase DateTime de Joda-Time por primera vez, existen problemas de rendimiento conocidos que ocurren debido a la carga de [descriptores de cronología](http://joda-time.sourceforge .net/apidocs/org/joda/time/chrono/ISOChronology.html).

Es fácil formatear este objeto:

1
2
DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss");
System.out.println(fmt.print(dateTime));

Ejecutar este fragmento de código produciría:

1
05-02-2020 10:33:05

Conclusión

Hay muchos casos en los que alguien necesitaría obtener la fecha y/o la hora actual en Java, y hemos cubierto todos los enfoques que existen hasta ahora para hacerlo, incluidas las clases más antiguas: java.util.Date y java.util.Calendar así como las nuevas clases java.time que llegaron con la nueva API de Fecha/Hora.

Además, hemos cubierto Joda-Time y su enfoque para obtener la fecha y la hora actuales.

If you'd like to read about Convertir una cadena en una fecha en Java, we've got it covered!

Licensed under CC BY-NC-SA 4.0