Java Fecha y Hora

โšก Resumen inteligente

Java El manejo de fechas y horas combina las clases heredadas java.util.Date y SimpleDateFormat con la API moderna java.time introducida en Java 8, que proporciona a los desarrolladores tipos inmutables y seguros para subprocesos para un trabajo preciso con el calendario.

  • ๐Ÿ•’ Fecha de legado: La clase java.util.Date almacena un instante en milisegundos e imprime una cadena predeterminada mediante el mรฉtodo toString.
  • ๐Ÿ”ค Letras de patrones: SimpleDateFormat utiliza letras como yyyy, MM, dd, HH, mm, ss y zzz para definir formatos de salida personalizados.
  • ๐Ÿ‡ง๐Ÿ‡ท Comparaciรณn: El mรฉtodo compareTo devuelve un nรบmero entero negativo, cero o positivo para ordenar cronolรณgicamente dos instancias de Date.
  • ๐Ÿ†• API moderna: En java.time, LocalDate, LocalDateTime, ZonedDateTime e Instant reemplazan Date y Calendar con objetos inmutables.
  • ๐Ÿงต Seguridad del hilo: DateTimeFormatter es inmutable y seguro para compartir, mientras que SimpleDateFormat necesita sincronizaciรณn o un contenedor ThreadLocal.
  • ๐Ÿ” Interoperabilidad: Convierta entre las API antiguas y nuevas utilizando las funciones auxiliares Date.toInstant, Date.from y Calendar.toInstant.

Java Fecha y Hora

Manejo de fechas y horas en Java Es una parte rutinaria de la creaciรณn de lรณgica de programaciรณn, marcas de tiempo de registro, informes y registros de auditorรญa. Antes de escribir cualquier cรณdigo, es รบtil conocer los parรกmetros que componen una fecha:

  • El year (en dos o cuatro dรญgitos).
  • El mes (como dos dรญgitos, como las tres primeras letras del mes o como el nombre completo del mes).
  • El datos (el nรบmero real del dรญa del mes).
  • El day (el nombre del dรญa en la fecha indicada, como dom., lun., mar.).

Java Expone muchos otros parรกmetros que describen un momento en la lรญnea de tiempo, como la era, la semana del aรฑo, la zona horaria y el desfase horario. Las secciones siguientes cubren cada uno de ellos con ejemplos prรกcticos.

Cรณmo utilizar la fecha en Java

Mostrar fecha en Java

Java proporciona una Date clase en el java.util Paquete. La clase almacena un instante especรญfico en el tiempo con precisiรณn de milisegundos y ofrece mรฉtodos auxiliares para imprimir, comparar y formatear ese instante. Para obtener la fecha y hora actuales, instancie la clase con su constructor predeterminado:

import java.util.Date;

class Date_Ex1 {
    public static void main(String args[]) {
        // Instantiate a Date object by invoking its constructor
        Date objDate = new Date();
        // Display the Date and Time using toString()
        System.out.println(objDate.toString());
    }
}

Salida:

Wed Nov 29 06:36:22 UTC 2017

El ejemplo imprime la fecha en el formato toString predeterminado. Para mostrar el mismo instante en un patrรณn diferente, primero debe comprender las letras de formato que Java usos.

SimpleDateFormat: analizar y formatear fechas

El SimpleDateFormat clase en java.text convierte un Date objeto en una cadena formateada y analiza una cadena formateada de nuevo en una DateUtiliza letras con patrones que se corresponden con un componente de fecha u hora. La siguiente tabla enumera todas las letras compatibles:

CartaComponente de fecha u horaEjemplo
GDesignador de eraAD
yAรฑo 2026
MMes del aรฑojulio o julio o 07
wSemana en el aรฑo27
WSemana en mes2
DDรญa en el aรฑo189
dDรญa en mes10
FDรญa de la semana en el mes2
ENombre del dรญa en la semanamartes o martes
uNรบmero de dรญa de la semana (1 = Monday, 7 = Domingo)1
aMarcador AM o PMPM
HHora del dรญa (0-23)0
kHora del dรญa (1-24)24
KHora en AM o PM (0-11)0
hHora en AM o PM (1-12)12
mMinuto en hora30
sSegundo en minuto55
SMilisegundo978
zZona horaria (nombre)Hora estรกndar del Pacรญfico; PST; GMT -08: 00
ZZona horaria (desplazamiento RFC 822)-0800
XZona horaria (desplazamiento segรบn la norma ISO 8601)-08 o -0800 o -08:00

No es necesario que recuerdes toda la tabla. Consรบltala siempre que crees un nuevo patrรณn.

Cรณmo usar SimpleDateFormat

SimpleDateFormat es una subclase de DateFormat Esto te permite formatear y analizar fechas usando las letras del patrรณn anterior. Combina las letras para describir la cadena exacta que deseas generar o leer.

Por ejemplo:

  1. Formato de fecha requerido: 2012.10.23 20:20:45 PST. El patrรณn de formato apropiado es yyyy.MM.dd HH:mm:ss zzz.
  2. Formato de fecha requerido: 09:30:00 AM 23-May-2012. El patrรณn de formato apropiado es hh:mm:ss a dd-MMM-yyyy.

Tip: Mayรบsculas M es mes, minรบscula m es minรบsculo. Mayรบscula H es un reloj de 24 horas, minรบsculas h Es un reloj de 12 horas. Mezclarlos produce un resultado errรณneo silencioso.

El siguiente programa imprime la fecha actual dos veces, una en formato predeterminado y otra mediante un patrรณn SimpleDateFormat:

import java.text.SimpleDateFormat;
import java.util.Date;

class TestDates_Format {
    public static void main(String args[]) {
        // Current system date and time is assigned to objDate
        Date objDate = new Date();
        System.out.println(objDate);

        // Build the target pattern and format the date
        String strDateFormat = "hh:mm:ss a dd-MMM-yyyy";
        SimpleDateFormat objSDF = new SimpleDateFormat(strDateFormat);
        System.out.println(objSDF.format(objDate));
    }
}

Salida:

Wed Nov 29 06:31:41 UTC 2017
06:31:41 AM 29-Nov-2017

Ejemplo de comparaciรณn de fechas

Ejemplo de comparaciรณn de fechas

La forma mรกs fiable de pedir dos Date los objetos son el compareTo() Mรฉtodo. Devuelve un entero negativo cuando la llamada se realiza antes, cero cuando ambos instantes coinciden y un entero positivo cuando la llamada se realiza despuรฉs. El siguiente fragmento analiza dos cadenas de fecha e imprime su orden relativo:

import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;

class TestDates_Compare {
    public static void main(String args[]) throws ParseException {

        SimpleDateFormat objSDF = new SimpleDateFormat("dd-MM-yyyy");
        Date dt_1 = objSDF.parse("20-08-1981");
        Date dt_2 = objSDF.parse("12-10-2012");

        System.out.println("Date1 : " + objSDF.format(dt_1));
        System.out.println("Date2 : " + objSDF.format(dt_2));

        // compareTo returns > 0 when dt_1 is after dt_2
        if (dt_1.compareTo(dt_2) > 0) {
            System.out.println("Date 1 occurs after Date 2");
        }
        // compareTo returns < 0 when dt_1 is before dt_2
        else if (dt_1.compareTo(dt_2) < 0) {
            System.out.println("Date 1 occurs before Date 2");
        }
        // compareTo returns 0 when both dates are equal
        else {
            System.out.println("Both are the same date");
        }
    }
}

Salida:

Date1 : 20-08-1981
Date2 : 12-10-2012
Date 1 occurs before Date 2

Nota: El cรณdigo original utilizaba el patrรณn dd-mm-yyyy. La minรบscula mm La letra es minuto, no mes, por lo que el analizador produjo silenciosamente un valor de mes incorrecto. La soluciรณn anterior utiliza mayรบsculas. MM para el mes, que es la letra del patrรณn correcto.

Java 8 API moderna de fecha y hora (java.time)

Java 8 introdujo el java.time Paquete con una API rediseรฑada inspirada en la biblioteca Joda-Time. Las nuevas clases son inmutables, seguras para subprocesos y separan el calendario humano de la lรญnea de tiempo de la mรกquina. Los tipos mรกs comunes son:

  • LocalDate para una fecha sin hora ni zona horaria (por ejemplo, un cumpleaรฑos).
  • LocalTime para una hora en el reloj de pared sin fecha ni zona horaria.
  • LocalDateTime para una fecha y hora sin zona horaria.
  • ZonedDateTime para una fecha y hora con una zona horaria especรญfica.
  • OffsetDateTime para una fecha y hora con un desplazamiento UTC pero sin zona horaria con nombre.
  • Instant para una marca de tiempo de mรกquina medida desde la รฉpoca UNIX.
  • Duration y Period para importes basados โ€‹โ€‹en el tiempo y en la fecha.

El siguiente ejemplo imprime la fecha, la hora, la marca de tiempo y la zona horaria actuales utilizando la API moderna:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.Instant;
import java.time.ZoneId;

class ModernDateDemo {
    public static void main(String args[]) {
        LocalDate today = LocalDate.now();
        LocalDateTime now = LocalDateTime.now();
        ZonedDateTime zoned = ZonedDateTime.now(ZoneId.of("Asia/Kolkata"));
        Instant epoch = Instant.now();

        System.out.println("LocalDate     : " + today);
        System.out.println("LocalDateTime : " + now);
        System.out.println("ZonedDateTime : " + zoned);
        System.out.println("Instant       : " + epoch);
    }
}

Cada tipo tiene mรฉtodos de fรกbrica (now, of, parse) y operaciones inmutables (plusDays, minusHours, withYear) que devuelven un valor nuevo en lugar de modificar el objeto original.

DateTimeFormatter: Formatear fechas en formato moderno Java

DateTimeFormatter in java.time.format reemplaza SimpleDateFormatUtiliza el mismo estilo de letras de patrรณn, es inmutable y se puede compartir de forma segura entre hilos sin sincronizaciรณn adicional. La clase tambiรฉn expone constantes predefinidas como ISO_LOCAL_DATE y ISO_ZONED_DATE_TIME para formatos estรกndar.

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class FormatterDemo {
    public static void main(String args[]) {
        LocalDateTime now = LocalDateTime.now();

        DateTimeFormatter iso = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        DateTimeFormatter human = DateTimeFormatter.ofPattern("hh:mm:ss a dd-MMM-yyyy");

        System.out.println(now.format(iso));
        System.out.println(now.format(human));

        LocalDateTime parsed = LocalDateTime.parse("2026-07-04T09:30:00", iso);
        System.out.println("Parsed back : " + parsed);
    }
}

Para comparar dos fechas en la API moderna, llame a isBefore, isAfter, o isEqualEstos mรฉtodos se leen con mayor claridad que compareTo y trabajar con cada uno java.time clase.

Seguridad de los hilos y mejores prรกcticas para Java Fecha y Hora

Ambos java.util.Date y SimpleDateFormat son anteriores a los concurrentes modernos. Javay cada una tiene sus inconvenientes conocidos. Siga las prรกcticas que se indican a continuaciรณn para mantener un manejo correcto de las fechas en el cรณdigo de producciรณn:

  • Prefiera java.time a Date y Calendar. Los nuevos tipos son inmutables y seguros para subprocesos, y modelan el dominio con mayor precisiรณn (fechas sin horas, horas sin zonas horarias, etc.).
  • No compartas un SimpleDateFormat entre hilos. La clase almacena el estado de anรกlisis interno y no es segura para subprocesos. Envuรฉlvala en una ThreadLocal, sincronizar en la instancia o cambiar a DateTimeFormatter.
  • Especifique siempre una configuraciรณn regional. Los nombres de los meses y los dรญas cambian con la configuraciรณn regional predeterminada de la JVM, lo que hace que patrones como MMM y EEE no portรกtil. Pase una configuraciรณn regional explรญcitamente (por ejemplo, Locale.ENGLISH).
  • Sea explรญcito sobre las zonas horarias. LocalDateTime no tiene zona, asรญ que conviรฉrtalo a ZonedDateTime or Instant Siempre que el momento exacto importa, especialmente para los registros, las columnas de la base de datos y las cargas รบtiles de la red.
  • Realice la conversiรณn entre las dos API con cuidado. Usar date.toInstant(), Date.from(instant), y calendar.toInstant().atZone(zone) en la frontera entre el cรณdigo heredado y el cรณdigo moderno.
  • Almacenar marcas de tiempo en UTC. Persiste y transmit fechas como UTC (un Instant o una cadena ISO 8601) y convertir a la zona de usuario solo cuando se muestre.

Preguntas Frecuentes

Llama a LocalDateTime.now() del paquete java.time para obtener una fecha y hora en la zona del sistema, o a LocalDate.now() para obtener solo una fecha. En versiones anteriores Java, utilice new java.util.Date() para obtener el instante actual.

java.util.Date representa un instante en milisegundos desde la รฉpoca y es mutable. LocalDate modela una fecha de calendario sin hora ni zona horaria, es inmutable y segura para subprocesos, y ofrece mรฉtodos mรกs claros como plusDays e isBefore.

No. SimpleDateFormat mantiene un estado de anรกlisis mutable y produce resultados errรณneos cuando se comparte entre subprocesos. Envuรฉlvalo en un ThreadLocal, sincronรญcelo en la instancia o cambie a DateTimeFormatter, que es inmutable y seguro.

Pase la cadena exacta โ€œaaaa-MM-ddโ€. MM en mayรบsculas representa el mes y mm en minรบsculas, los minutos. Para la fecha y hora completas, use โ€œaaaa-MM-dd HH:mm:ssโ€. Especifique siempre la configuraciรณn regional para que los nombres de los meses sean reproducibles.

Con Date heredado, use compareTo, que devuelve un entero negativo, cero o positivo. Con java.time, llame a isBefore, isAfter o isEqual en un LocalDate o Instant. Ambos mรฉtodos respetan el orden cronolรณgico.

Llama a date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(). Para volver atrรกs, usa Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()). Selecciona la zona explรญcitamente cuando el momento exacto sea importante.

Los modelos de IA entrenados con corpus de registros y documentos infieren el patrรณn probable a partir de cadenas de muestra y devuelven un patrรณn DateTimeFormatter coincidente. Los clasificadores de aprendizaje automรกtico tambiรฉn seรฑalan campos ambiguos, como el orden mes-dรญa frente al dรญa-mes.

Sรญ. GitHub Copilot sugiere patrones DateTimeFormatter, conversiones ZonedDateTime y JUnit Pruebas para salida sensible a la configuraciรณn regional. RevRevisa cada sugerencia para ver las letras del patrรณn, la configuraciรณn regional y la zona horaria correctas antes de confirmar.

Resumir este post con: