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
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
// 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.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.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:
- No es seguro para hilos: los objetos Date son mutables, lo que puede causar problemas en entornos multihilo.
- 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.
- 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.
- 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.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 fechaLocalTime- Solo horaLocalDateTime- Fecha y horaZonedDateTime- Fecha, hora y zona horaria- Métodos ricos para operaciones de fecha
Resumen
DateLa clase es la clase básica para representar fecha y hora en Java, pero tiene algunas limitaciones.- Usar
SimpleDateFormatpuede formatear y analizar cadenas de fecha. - En Java 8 y versiones posteriores, se recomienda usar la nueva
java.timeAPI en lugar deDatela clase. - Al mantener código antiguo, comprender
Datela 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) |