Ir al contenido principal

Java Tip 30: Date & Time API

Quien lleva tiempo programando en Java sabrá que el formateo de fechas es un verdadero dolor de cabeza.

Afortunadamente desde la versión 8 Java posee una nuevo Date y Time API que permite ahorrarnos algunos bloques de código engorrosos y tediosos.

¿Qué veremos? Nos enfocaremos en estas clases del paquete ``java.time``:

  • Instant: para un punto en el tiempo, un instante (antes se usaba System.currentTimeMillis()).
  • LocalDate: para obtener la fecha del sistema.
  • LocalTime: para obtener la hora del sistema
  • LocalDateTime: para obtener fecha y hora del sistema.
  • ZonedDateTime: para obtener fecha y hora del sistema por zona horaria.

TestTimeAPI.java

import java.time.LocalTime;
import java.time.LocalDate;
import java.time.LocalDateTime;

public class TestTimeAPI{

    public static void main(String[] args){
        System.out.println("\t Nueva API Time de Java.");
          
        LocalTime horaActual = LocalTime.now();
        LocalDate tiempoActual = LocalDate.now();
        LocalDateTime tiempoHoraActual = LocalDateTime.now();

        System.out.printf("Hora actual: %s\n", horaActual.toString());
        System.out.printf("Fecha actual: %s\n", tiempoActual.toString());
        System.out.printf("Fecha y hora actual: %s\n", tiempoHoraActual.toString());
     }

}

Compilación y ejecución:

$ javac -g TestTimeAPI.java
$ java TestTimeAPI

Salida:

Hora actual: 18:45:22.203592700
Fecha actual: 2026-04-11
Fecha y hora actual: 2026-04-11T18:45:22.203592700

Como se puede ver nos permite:

  • Obtener la fecha.
  • Obtener la hora y 
  • Obtener la fecha con hora actual.

Ahora veremos la clase Instant:

TestTimeAPI.java

import java.time.Instant;

public class TestTimeAPI{

    public static void main(String[] args){
        System.out.println("\t Nueva API Time de Java.");
                
        Instant ahora = Instant.now();
        System.out.println("Instante actual: " + ahora);

        Instant epochPlus10Segundos = Instant.ofEpochSecond(10);
        System.out.println("Epoch + 10 segundos: " + epochPlus10Segundos);

        Instant dentroDeUnaHora = ahora.plusSeconds(3600);
        System.out.println("Dentro de una hora: " + dentroDeUnaHora);

        Instant haceCincoMinutos = ahora.minusSeconds(300);
        System.out.println("Hace cinco minutos: " + haceCincoMinutos);
		
	

    }   

}

Compilación y ejecución:

$ javac -g TestTimeAPI.java
$ java TestTimeAPI

Salida:

Instante actual: 2026-04-12T00:45:22.215549300Z
Epoch + 10 segundos: 1970-01-01T00:00:10Z
Dentro de una hora: 2026-04-12T01:45:22.215549300Z
Hace cinco minutos: 2026-04-12T00:40:22.215549300Z

Como se puede observar hemos:

  • Obtenido el instante actual en UTC. 
  • Creado un instante a partir de un número de segundos desde el epoch (1970-01-01T00:00:00Z). 
  • Sumar y restar tiempo

Ahora veremos la clase ``ZonedDateTime``:

TestTimeAPI.java

import java.time.ZonedDateTime;
import java.time.ZoneId;

public class TestTimeAPI{

    public static void main(String[] args){
        System.out.println("\t Nueva API Time de Java.");
          
        
        ZonedDateTime ahoraZona = ZonedDateTime.now();
        System.out.println("Ahora en zona local: " + ahoraZona);

        ZonedDateTime nyTime = ZonedDateTime.now(ZoneId.of("America/New_York"));
        System.out.println("Hora en Nueva York: " + nyTime);

        ZonedDateTime tokyoTime = ahoraZona.withZoneSameInstant(ZoneId.of("Asia/Tokyo"));
        System.out.println("Hora equivalente en Tokio: " + tokyoTime);

        ZonedDateTime evento = ZonedDateTime.of(2026, 4, 11, 18, 30, 0, 0, ZoneId.of("America/Mexico_City"));
        System.out.println("Evento en CDMX: " + evento);

    }   

}

Compilación y ejecución:

$ javac -g TestTimeAPI.java
$ java TestTimeAPI

Salida:

Ahora en zona local: 2026-04-11T18:45:22.274598100-06:00[America/Mexico_City]
Hora en Nueva York: 2026-04-11T20:45:22.292591300-04:00[America/New_York]
Hora equivalente en Tokio: 2026-04-12T09:45:22.274598100+09:00[Asia/Tokyo]
Evento en CDMX: 2026-04-11T18:30-06:00[America/Mexico_City]

Con este ejemplo hemos:

  • Obtenido la fecha y hora actual en la zona horaria del sistema. 
  • Obtenido la fecha y hora en una zona específica (ejemplo: Nueva York). 
  • Convertir entre zonas horarias. 
  • Creado un ZonedDateTime específico.

La API ``java.time`` en Java es muy poderosa, pues permite trabajar con fechas, horas, zonas horarias, instantes precisos y duraciones de manera clara y segura

Observemos la siguiente tabla que trata de resumir esta API.

Clase Qué representa Ejemplos de uso
LocalDate Fecha (año, mes, día) sin hora ni zona Obtener la fecha actual, sumar días, calcular edad
LocalTime Hora del día sin fecha ni zona Obtener hora actual, comparar horas, programar alarmas
LocalDateTime Fecha y hora sin zona horaria Registrar eventos, combinar fecha y hora
ZonedDateTime Fecha y hora con zona horaria Convertir entre zonas, manejar horarios internacionales
Instant Momento exacto en UTC Marcas de tiempo, cálculos precisos de duración
Duration Diferencia entre dos instantes (tiempo) Medir cuánto tarda un proceso, calcular intervalos
Period Diferencia entre dos fechas (años, meses, días) Calcular edad, tiempo hasta un evento
ZoneId Identificador de zona horaria Definir zonas como "America/Mexico_City"
OffsetDateTime Fecha y hora con desplazamiento fijo respecto a UTC Trabajar con APIs que usan offsets (+02:00, -06:00)

Estos solo son algunos ejemplos de uso de esta nueva API Time de Java.

Enlaces:

https://medium.com/javarevisited/mastering-the-java-time-api-a-comprehensive-guide-c22376ab323a
https://www.arquitecturajava.com/java-8-date-time-api/
https://keepcoding.io/blog/como-funciona-java-time-localtime-en-java/

Comentarios

Entradas populares de este blog

Java Tip 1: Importaciones por default

Tip 1 : Todas las clases del paquete java.lang se importan por defecto. Podríamos hacer algo como esto: import java.lang.System ; import java.lang.String ; import java.lang.Boolean ; import java.lang.Integer ; import java.lang.Short ; import java.lang.StringBuilder ; import java.lang.StringBuffer ; O cosas (aberrantes) como: //Traernos todas las clases del paquete java.lang import java.lang.* ; Sin embargo, no es necesario. Repitamos esto como un mantra: Todas las clases del paquete  java.lang  se importan por defecto, no es necesario escribir de más .

Java Tip 28: hilos virtuales en Java

Con Java 21 entra un nuevo concepto: hilos virtuales java ( Java Virtual Threads ).  La cual es una nueva característica que nos permite crear miles o millones de hilos (tareas en paralelo). Los cuales se diferencian de los hilos comunes ( Platform Threads ) al no depender del sistema operativo , puesto que son virtuales. De estos se encargará la JVM. Al usar hilos virtuales ahorramos recursos del procesador y de memoria del sistema , sin importar si estamos creando y/o usando miles o millones. Los hilos virtuales son ideales para aplicaciones modernas donde se requiere esperar y recibir respuestas o acceder a bases de datos remotas, entre otras cosas. Además no impide usar los hilos comunes que dependen del sistema operativo. Observemos un ejemplo de uso de hilos virtuales. VirtualThreadsDemo.java package com.comunidad.demo; public class VirtualThreadsDemo { public static void main (String [] args) throws InterruptedException { // Crear un Virtual Th...

Java Tip 20: JDBC (2da parte)

Continuamos con esta serie sobre JDBC . Como dijimos la vez anterior JDBC( Java Database Connectivity ) es el estándar de conectividad de bases de datos de Java y proporciona un mecanismo para que los programas Java se conecten a las bases de datos. En este post veremos ejemplos de su uso. Requisitos: Tener nociones de Java.  Tener nociones de SQL (usaremos H2). Tener nociones de Maven. Creando una aplicación JDBC Crearemos una sencilla aplicación que se conecte a una BD H2 (ver  tutorial ). Pasos: Crearemos una tabla a la que llamaremos Cursos. La cual tendrá los siguientes campos: id, titulo, materia, instructor, fecha y hora. Crear la aplicación Java usando Maven. Crearemos instrucciones SQL para consultar la información, ingresar nuevos cursos, actualizar y eliminar registros. Ejecutar la aplicación con Maven. 1. Creamos la tabla con sus seis campos (agregaremos los datos con la aplicación Java): CREATE OR REPLACE TABLE CURSOS( id bigint ...