Clase Java Date

En JavaDatela clase se encuentra enjava.utilel paquete, representa un instante específico, con precisión de milisegundos.

La clase Date se utiliza principalmente para representar información de fecha y hora, y es una de las clases básicas para manejar fechas y horas en Java.

Es importante tener en cuenta que después de Java 8 se introdujo la nueva API de fecha y hora (java.timepaquete), que esDatemás potente y fácil de usar que la clase. Sin embargo, en muchos códigos heredados, todavía verásDateel uso de la clase.


Uso básico de la clase Date

Crear objeto Date

La clase Date tiene varios constructores, los dos más comunes son:

Ejemplo

// Crear un objeto Date que representa la hora actual
Date currentDate = new Date();

// Crear un objeto Date para un tiempo específico (milisegundos desde el 1 de enero de 1970 00:00:00 GMT)
Date specificDate = new Date(1640995200000L); // 1 de enero de 2022 00:00:00 GMT

Métodos comunes

La clase Date proporciona varios métodos comunes:

Ejemplo

Date date = new Date();

// Obtener los milisegundos transcurridos desde el 1 de enero de 1970 00:00:00 GMT
long timeInMillis = date.getTime();

// Establecer la hora (milisegundos desde el 1 de enero de 1970 00:00:00 GMT)
date.setTime(1640995200000L);

// Comparar dos fechas
Date anotherDate = new Date();
int result = date.compareTo(anotherDate); // Devuelve -1 si es menor, 0 si es igual, 1 si es mayor

// Comprueba si la fecha es posterior a la fecha especificada
boolean isAfter = date.after(anotherDate);

// Comprueba si la fecha es anterior a la fecha especificada
boolean isBefore = date.before(anotherDate);

Formateo de la clase Date

La clase Date en sí no proporciona funcionalidades de formato, pero podemos usarSimpleDateFormatla clase para formatear y analizar fechas.

Ejemplo de formato de fecha

Ejemplo

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

public class DateFormatExample {
    public static void main(String[] args) {
        Date date = new Date();
       
        // Crear un objeto de formato
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf2 = new SimpleDateFormat(yyyyañoMMmesdddía E HHCuandommdividirsssegundo);
       
        // Formatear fecha
        String formattedDate1 = sdf1.format(date);
        String formattedDate2 = sdf2.format(date);
       
        System.out.println("Formato 1: " + formattedDate1);
        System.out.println("Formato 2: " + formattedDate2);
    }
}

El resultado es:

格式1: 2025-05-01 11:33:43
格式2: 2025年05月01日 周四 11时33分43秒

Patrones de formato comunes

Letra Significado Ejemplo
y año yyyy → 2023
M mes MM → 01, MMM → Jan
d día dd → 05
H Hora (formato de 24 horas) HH → 13
h Hora (formato de 12 horas) hh → 01
m Minuto mm → 30
s segundo ss → 45
S Milisegundo SSS → 789
E Día de la semana E → Lunes
a Marcador AM/PM a → PM

Ejemplo integral

A continuación se muestra un ejemplo sencillo de Date:

Ejemplo

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

public class DateDemo {
    public static void main(String[] args) {
        // 1. Crear un objeto Date que representa la hora actual
        Date now = new Date();
        System.out.println("Hora actual: " + now);
       
        // 2. Crear un objeto Date para una hora específica (método obsoleto, no recomendado)
        @SuppressWarnings("deprecation")
        Date oldDate = new Date(123, 4, 15); // 15 de mayo de 2023 (mes de 0 a 11)
        System.out.println("Fecha específica: " + oldDate);
       
        // 3. Crear un objeto Date usando una marca de tiempo (forma recomendada)
        Date dateFromTimestamp = new Date(1684131330000L); // 2023-05-15 10:15:30
        System.out.println("Creado desde marca de tiempo: " + dateFromTimestamp);
       
        // 4. Formatear salida de fecha
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formattedDate = sdf.format(now);
        System.out.println("Fecha formateada: " + formattedDate);
       
        // 5. Analizar cadena a Date
        try {
            Date parsedDate = sdf.parse("2023-05-15 10:30:00");
            System.out.println("Fecha analizada: " + parsedDate);
        } catch (Exception e) {
            e.printStackTrace();
        }
       
        // 6. Obtener marca de tiempo
        long timestamp = now.getTime();
        System.out.println("Marca de tiempo: " + timestamp);
       
        // 7. Comparación de fechas
        System.out.println("¿Está now después de dateFromTimestamp?: " + now.after(dateFromTimestamp));
        System.out.println("¿Está now antes de dateFromTimestamp?: " + now.before(dateFromTimestamp));
    }
}

El resultado es:

当前时间: Thu May 01 11:33:05 CST 2025
特定日期: Mon May 15 00:00:00 CST 2023
从时间戳创建: Mon May 15 14:15:30 CST 2023
格式化日期: 2025-05-01 11:33:05
解析后的日期: Mon May 15 10:30:00 CST 2023
时间戳: 1746070385401
now 是否在 dateFromTimestamp 之后: true
now 是否在 dateFromTimestamp 之前: false

Limitaciones de la clase Date

Aunque la clase Date todavía es útil en muchos casos, tiene algunas limitaciones evidentes:

  1. No es seguro para hilos: los objetos Date son mutables, lo que puede causar problemas en entornos multihilo.
  2. Diseño deficiente: el mes comienza en 0 (0 representa enero) y el año se calcula desde 1900, lo que puede causar confusión.
  3. Manejo complejo de zonas horarias: la clase Date en sí no contiene información de zona horaria, el manejo de zonas horarias requiere clases adicionales.
  4. Funcionalidad limitada: carece de muchas funciones comunes de operación de fechas, como sumar/restar días, semanas, etc.

Alternativa: API de fecha y hora de Java 8

Java 8 introdujo la nueva API de fecha y hora (java.timepaquete), que resuelve muchos problemas de la clase Date:

Ejemplo

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

public class NewDateTimeExample {
    public static void main(String[] args) {
        // Obtener fecha y hora actuales
        LocalDateTime now = LocalDateTime.now();
       
        // Formatear
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formattedDateTime = now.format(formatter);
       
        System.out.println("Hora actual: " + formattedDateTime);
    }
}

La nueva API de fecha y hora ofrece más funciones, como:

  • LocalDate- Solo fecha
  • LocalTime- Solo hora
  • LocalDateTime- Fecha y hora
  • ZonedDateTime- Fecha, hora y zona horaria
  • Métodos ricos para operaciones de fecha

Resumen

  1. DateLa clase es la clase básica para representar fecha y hora en Java, pero tiene algunas limitaciones.
  2. UsarSimpleDateFormatpuede formatear y analizar cadenas de fecha.
  3. En Java 8 y versiones posteriores, se recomienda usar la nuevajava.timeAPI en lugar deDatela clase.
  4. Al mantener código antiguo, comprenderDatela clase sigue siendo importante.

Si estás desarrollando un proyecto nuevo, se recomienda considerar primero la nueva API de fecha y hora de Java 8, ya que es más intuitiva, potente y segura para hilos.

A continuación se presentan los métodos comunes de la clase java.util.Date:

Constructores

Método Descripción Nota
Date() Crea un objeto Date que representa la hora actual Obsoleto, se recomienda usarnew Date()oCalendar.getInstance()
Date(long date) Crea un objeto Date según los milisegundos especificados Los milisegundos se calculan desde el 1 de enero de 1970 00:00:00 GMT

Métodos comunes

Método Descripción Nota
boolean after(Date when) Prueba si esta fecha es posterior a la fecha especificada
boolean before(Date when) Prueba si esta fecha es anterior a la fecha especificada
Object clone() Devuelve una copia de este objeto
int compareTo(Date anotherDate) Compara el orden de dos fechas
boolean equals(Object obj) Compara la igualdad de dos fechas
long getTime() Devuelve los milisegundos desde el 1 de enero de 1970
void setTime(long time) Establece este objeto Date usando los milisegundos
String toString() Convierte el objeto Date a una representación de cadena Formato como: "Tue Jun 22 13:07:00 CST 2021"

Métodos obsoletos (no recomendados)

Método Descripción Alternativa
int getDate() Obtener el día del mes (1-31) UsarCalendar.get(Calendar.DATE)
int getDay() Obtener el día de la semana (0-6) UsarCalendar.get(Calendar.DAY_OF_WEEK)
int getHours() Obtener la hora (0-23) UsarCalendar.get(Calendar.HOUR_OF_DAY)
int getMinutes() Obtener los minutos (0-59) UsarCalendar.get(Calendar.MINUTE)
int getMonth() Obtener el mes (0-11) UsarCalendar.get(Calendar.MONTH)
int getSeconds() Obtener los segundos (0-59) UsarCalendar.get(Calendar.SECOND)
int getYear() Obtener el año (desde 1900) UsarCalendar.get(Calendar.YEAR)
void setDate(int date) Establecer el día del mes UsarCalendar.set(Calendar.DATE, date)
void setHours(int hours) Establecer la hora UsarCalendar.set(Calendar.HOUR_OF_DAY, hours)
void setMinutes(int minutes) Establecer los minutos UsarCalendar.set(Calendar.MINUTE, minutes)
void setMonth(int month) Establecer el mes UsarCalendar.set(Calendar.MONTH, month)
void setSeconds(int seconds) Establecer los segundos UsarCalendar.set(Calendar.SECOND, seconds)
void setYear(int year) Establecer el año UsarCalendar.set(Calendar.YEAR, year)
Otras extensiones