Fecha y hora de Java
Java proporciona varios conjuntos de API de fecha y hora. A continuación se presenta una comparación de las principales categorías y un resumen de los métodos comunes:
| Categoría | Clases principales | Seguridad de hilos | Mutabilidad | Versión de Java | Características |
|---|---|---|---|---|---|
| Fecha tradicional | Date, Calendar,GregorianCalendar | no | Mutable | 1.0+ | Muchos defectos de diseño, no se recomienda su uso |
| Nueva fecha y hora | LocalDate, LocalTime, LocalDateTime, ZonedDateTime, ChronoUnit | Sí | Inmutable | 8+ | Bien diseñado, recomendado su uso |
| Marca de tiempo | Instant | Sí | Inmutable | 8+ | Tiempo de máquina, preciso hasta nanosegundos |
| Formateo | DateTimeFormatter | Sí | Inmutable | 8+ | Clase de formateo segura para hilos |
LocalDate/DateTimeFormatter
LocalDate/DateTimeFormatter son clases de fecha introducidas en Java 8. LocalDate se usa para representar una fecha sin hora (año-mes-día), y DateTimeFormatter se usa para formatear y analizar objetos de fecha y hora.
Ejemplo
import java.time.format.DateTimeFormatter;
public class EjemploTest {
public static void main(String[] args) {
// Obtener la fecha actual
LocalDate today = LocalDate.now();
System.out.println("Fecha actual: " + today);
// Crear una fecha específica
LocalDate nationalDay = LocalDate.of(2025, 10, 1);
System.out.println("Día Nacional: " + nationalDay);
// Sumar y restar fechas
LocalDate tomorrow = today.plusDays(1);
LocalDate nextMonth = today.plusMonths(1);
LocalDate lastYear = today.minusYears(1);
System.out.println("Mañana: " + tomorrow);
System.out.println("Próximo mes: " + nextMonth);
System.out.println("Hoy hace un año: " + lastYear);
}
}
La salida de los ejemplos anteriores es:
当前日期: 2025-05-01 国庆节: 2025-10-01 明天: 2025-05-02 下个月: 2025-06-01 去年今天: 2024-05-01
-
En proyectos nuevos, priorizar el uso del paquete java.time (Java 8+)
-
Evitar el uso de las antiguas clases Date y Calendar
-
Distinguir claramente el uso de zonas horarias:
-
Sin necesidad de zona horaria: LocalDate/LocalTime/LocalDateTime
-
Con necesidad de zona horaria: ZonedDateTime
-
-
Considerar la seguridad de hilos al formatear: usar DateTimeFormatter en lugar de SimpleDateFormat
-
Interacción con bases de datos:
-
JDBC 4.2+ admite directamente los tipos java.time
-
Versiones antiguas se pueden convertir a java.sql.Date/Timestamp
-
1. LocalDate (fecha)
Ejemplo
LocalDate date = LocalDate.of(2023, Month.JUNE, 15);
int year = date.getYear(); // 2023
Month month = date.getMonth(); // JUNE
int day = date.getDayOfMonth(); // 15
LocalDate nextWeek = today.plusWeeks(1);
boolean isLeap = date.isLeapYear(); // Si es año bisiesto
2. LocalTime (hora)
Ejemplo
LocalTime time = LocalTime.of(14, 30, 45); // 14:30:45
int hour = time.getHour(); // 14
int minute = time.getMinute(); // 30
LocalTime nextHour = time.plusHours(1);
3. LocalDateTime (fecha y hora)
Ejemplo
LocalDateTime dt = LocalDateTime.of(2023, 6, 15, 14, 30);
LocalDateTime nextMonth = dt.plusMonths(1);
4. ZonedDateTime (fecha y hora con zona horaria)
Ejemplo
ZonedDateTime nyTime = zdt.withZoneSameInstant(ZoneId.of("America/New_York"));
ZoneId zone = zdt.getZone(); // Obtener la zona horaria
5. Instant (marca de tiempo)
Ejemplo
Instant later = now.plusSeconds(60); // Después de 60 segundos
long epochMilli = now.toEpochMilli(); // Obtener la marca de tiempo en milisegundos
Clase Date
El paquete java.util proporciona la clase Date para encapsular la fecha y hora actuales. La clase Date proporciona dos constructores para instanciar objetos Date.
El primer constructor utiliza la fecha y hora actuales para inicializar el objeto.
El segundo constructor recibe un parámetro, que es la cantidad de milisegundos desde el 1 de enero de 1970.
Después de crear el objeto Date, se pueden llamar los siguientes métodos.
| N.º | Método y descripción |
|---|---|
| 1 |
boolean after(Date date) Devuelve true si el objeto Date que llama a este método es posterior a la fecha especificada; de lo contrario, devuelve false. |
| 2 |
boolean before(Date date) Devuelve true si el objeto Date que llama a este método es anterior a la fecha especificada; de lo contrario, devuelve false. |
| 3 |
Object clone( ) Devuelve una copia de este objeto. |
| 4 |
int compareTo(Date date) Compara el objeto Date que llama a este método con la fecha especificada. Devuelve 0 si ambos son iguales. Devuelve un número negativo si el objeto que llama es anterior a la fecha especificada. Devuelve un número positivo si el objeto que llama es posterior a la fecha especificada. |
| 5 |
int compareTo(Object obj) Si obj es de tipo Date, la operación es equivalente a compareTo(Date). De lo contrario, lanza una ClassCastException. |
| 6 |
boolean equals(Object date) Devuelve true cuando el objeto Date que llama a este método es igual a la fecha especificada; de lo contrario, devuelve false. |
| 7 |
long getTime( ) Devuelve el número de milisegundos que representa este objeto Date desde el 1 de enero de 1970, 00:00:00 GMT. |
| 8 |
int hashCode( ) Devuelve el valor del código hash de este objeto. |
| 9 |
void setTime(long time) Establece la fecha y hora usando el número de milisegundos transcurridos desde el 1 de enero de 1970, 00:00:00 GMT, indicado por time. |
| 10 |
String toString( ) Convierte este objeto Date a una cadena de la forma: dow mon dd hh:mm:ss zzz yyyy, donde: dow es el día de la semana (Sun, Mon, Tue, Wed, Thu, Fri, Sat). |
Obtener la fecha y hora actuales
En Java, obtener la fecha y hora actuales es muy sencillo. Usa el método toString() del objeto Date para imprimir la fecha y hora actuales, como se muestra a continuación:
Ejemplo
El resultado de compilar y ejecutar el ejemplo anterior es el siguiente:
Mon May 04 09:51:52 CDT 2013
Comparación de fechas
Java utiliza los siguientes tres métodos para comparar dos fechas:
- Usar el método getTime() para obtener los dos valores de fecha (milisegundos transcurridos desde el 1 de enero de 1970) y luego comparar estos dos valores.
- Usar los métodos before(), after() y equals(). Por ejemplo, el día 12 de un mes es anterior al 18, entoncesnew Date(99, 2, 12).before(new Date (99, 2, 18))devuelve true.
- Usar el método compareTo(), que está definido por la interfaz Comparable y la clase Date implementa esta interfaz.
1. Comparar usando el método getTime()
Este método compara los milisegundos transcurridos desde el 1 de enero de 1970 (época Unix) de los objetos de fecha.
Ejemplo
public class DateComparison {
public static void main(String[] args) {
Date date1 = new Date(121, 5, 15); // 15 de junio de 2021
Date date2 = new Date(121, 5, 20); // 20 de junio de 2021
// Comparar los milisegundos
if (date1.getTime() < date2.getTime()) {
System.out.println("date1 es anterior a date2");
} else if (date1.getTime() > date2.getTime()) {
System.out.println("date1 es posterior a date2");
} else {
System.out.println("Las dos fechas son iguales");
}
}
}
Salida:
date1 在 date2 之前
2. Usar los métodos before(), after() y equals()
Estos métodos son métodos de comparación incorporados de la clase Date, con semántica más clara.
Ejemplo
public class DateComparison {
public static void main(String[] args) {
Date date1 = new Date(121, 5, 15); // 15 de junio de 2021
Date date2 = new Date(121, 5, 20); // 20 de junio de 2021
// Usar el método before()
System.out.println("¿date1 es anterior a date2? " + date1.before(date2));
// Usar el método after()
System.out.println("¿date1 es posterior a date2? " + date1.after(date2));
// Usar el método equals()
System.out.println("¿Las dos fechas son iguales? " + date1.equals(date2));
}
}
Salida:
date1 在 date2 之前吗? true date1 在 date2 之后吗? false 两个日期相同吗? false
3. Usar el método compareTo()
La clase Date implementa la interfaz Comparable y se puede utilizar el método compareTo() para comparar.
Ejemplo
public class DateComparison {
public static void main(String[] args) {
Date date1 = new Date(121, 5, 15); // 15 de junio de 2021
Date date2 = new Date(121, 5, 20); // 20 de junio de 2021
int result = date1.compareTo(date2);
if (result < 0) {
System.out.println("date1 está antes que date2");
} else if (result > 0) {
System.out.println("date1 está después que date2");
} else {
System.out.println("Las dos fechas son iguales");
}
}
}
Salida:
date1 在 date2 之前
Formatear fechas con SimpleDateFormat
SimpleDateFormat es una clase que formatea y analiza fechas de forma sensible al locale. SimpleDateFormat te permite elegir cualquier formato de fecha y hora definido por el usuario. Por ejemplo:
Ejemplo
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
Esta línea de código establece el formato de conversión, donde yyyy es el año completo, MM es el mes, dd es el día, y HH:mm:ss son horas, minutos y segundos.
Nota: algunos formatos usan mayúsculas y otros minúsculas; por ejemplo, MM es el mes, mm son los minutos; HH es el formato de 24 horas, mientras que hh es el de 12 horas.
El resultado de compilar y ejecutar el ejemplo anterior es el siguiente:
当前时间为: 2018-09-06 10:16:34
Códigos de formato para fecha y hora
Las cadenas de patrón de tiempo se utilizan para especificar el formato de tiempo. En este patrón, todas las letras ASCII se reservan como letras de patrón, definidas a continuación:
| Letra | Descripción | Ejemplo |
|---|---|---|
| G | Marcador de era | AD |
| y | Año de cuatro dígitos | 2001 |
| M | Mes | July or 07 |
| d | Día del mes | 10 |
| h | Hora en formato A.M./P.M. (1~12) | 12 |
| H | Hora del día (0~23) | 22 |
| m | Minutos | 30 |
| s | Segundos | 55 |
| S | Milisegundos | 234 |
| E | Día de la semana | Tuesday |
| D | Día del año | 360 |
| F | Día de la semana dentro del mes | 2 (second Wed. in July) |
| w | Semana del año | 40 |
| W | Semana del mes | 1 |
| a | Marcador A.M./P.M. | PM |
| k | Hora del día (1~24) | 24 |
| K | Hora en formato A.M./P.M. (0~11) | 10 |
| z | Zona horaria | Eastern Standard Time |
| ' | Delimitador de texto | Delimiter |
| " | Comilla simple | ` |
Formatear fechas con printf
El método printf puede formatear horas y fechas fácilmente. Utiliza un formato de dos letras que comienza con%ty termina con una de las letras de la siguiente tabla.
- %tY: genera el año de cuatro dígitos, por ejemplo: 2023
- %ty: genera el año de dos dígitos, por ejemplo: 23
- %tm: genera el mes de dos dígitos, por ejemplo: 02
- %tB: genera el nombre completo del mes, por ejemplo: February
- %tb: genera la abreviatura del mes, por ejemplo: Feb
- %tA: genera el nombre completo del día de la semana, por ejemplo: Wednesday
- %ta: genera la abreviatura del día de la semana, por ejemplo: Wed
- %td: genera el día del mes de dos dígitos, por ejemplo: 24
- %te: genera el día del mes con uno o dos dígitos, por ejemplo: 24 o 02
- %tH: genera la hora en formato de 24 horas, por ejemplo: 23
- %tI: genera la hora en formato de 12 horas, por ejemplo: 11
- %tM: genera los minutos, por ejemplo: 45
- %tS: genera los segundos, por ejemplo: 30
- %tp: genera AM o PM, por ejemplo: AM o PM
- %tZ: genera la zona horaria, por ejemplo: GMT+08:00
|
Conversor |
Descripción |
Ejemplo |
|---|---|---|
|
%tc |
Incluye toda la información de fecha y hora |
Sábado Oct 27 14:21:20 CST 2007 |
|
%tF |
Formato "año-mes-día" |
2007-10-27 |
|
%tD |
Formato "mes/día/año" |
10/27/07 |
|
%tr |
Formato "HH:MM:SS PM" (12 horas) |
02:25:51 PM |
|
%tT |
Formato "HH:MM:SS" (24 horas) |
14:28:16 |
|
%tR |
Formato "HH:MM" (24 horas) |
14:28 |
MásprintfPara más información, consulte:Ejemplos de formato de salida printf en Java
Ejemplo
Ejemplo
public class DateFormatExample {
public static void main(String[] args) {
Date date = new Date();
System.out.printf("%tY-%tm-%td %tH:%tM:%tS %tZ", date, date, date, date, date, date, date);
}
}
El resultado de la ejecución es:
2023-02-24 13:34:45 GMT+08:00
Ejemplo
El resultado de compilar y ejecutar el ejemplo anterior es el siguiente:
全部日期和时间信息:星期一 九月 10 10:43:36 CST 2012 年-月-日格式:2012-09-10 月/日/年格式:09/10/12 HH:MM:SS PM格式(12时制):10:43:36 上午 HH:MM:SS格式(24时制):10:43:36 HH:MM格式(24时制):10:43
Si necesitas proporcionar la fecha repetidamente, usar este método para formatear cada una de sus partes resulta algo complicado. Por lo tanto, puedes utilizar una cadena de formato que indique el índice del argumento que se va a formatear.
El índice debe ir inmediatamente después de%y debe terminar con$fin. Por ejemplo:
Ejemplo
El resultado de compilar y ejecutar el ejemplo anterior es el siguiente:
Due date: February 09, 2014
O puedes usar el indicador <. Indica que el argumento formateado anteriormente se va a utilizar de nuevo. Por ejemplo:
Ejemplo
El resultado de compilar y ejecutar el ejemplo anterior es el siguiente:
Due date: February 09, 2014
Los conversores de formato de fecha permiten generar nuevas cadenas a partir de una fecha mediante conversores específicos. Estos conversores de fecha son los siguientes:
Ejemplo
El resultado de salida es:
英文月份简称:May 本地月份简称:五月 英文月份全称:May 本地月份全称:五月 英文星期的简称:Thu 本地星期的简称:星期四 年的前两位数字(不足两位前面补0):20 年的后两位数字(不足两位前面补0):17 一年中的天数(即年的第几天):124 两位数字的月份(不足两位前面补0):05 两位数字的日(不足两位前面补0):04 月份的日(前面不补0):4
Analizar cadenas como fecha/hora
La clase SimpleDateFormat tiene algunos métodos adicionales, en particular parse(), que intenta analizar una cadena de acuerdo con el formato almacenado en el objeto SimpleDateFormat dado. Por ejemplo:
Ejemplo
El resultado de compilar y ejecutar el ejemplo anterior es el siguiente:
$ java DateDemo 1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818 $ java DateDemo 2007-12-01 2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007
Java dormir (sleep)
sleep() hace que el hilo actual entre en estado de estancamiento (bloquea el hilo actual), cediendo el uso de la CPU; el objetivo es evitar que el hilo actual monopolice los recursos de CPU del proceso, dejando tiempo para que otros hilos tengan la oportunidad de ejecutarse.
Puedes hacer que el programa duerma durante un milisegundo o durante cualquier período de tiempo, incluso tan largo como la vida de tu computadora. Por ejemplo, el siguiente programa dormirá durante 3 segundos:
Ejemplo
El resultado de compilar y ejecutar el ejemplo anterior es el siguiente:
Thu Sep 17 10:20:30 CST 2015 Thu Sep 17 10:20:33 CST 2015
Medir el tiempo
El siguiente ejemplo muestra cómo medir intervalos de tiempo (en milisegundos):
Ejemplo
El resultado de compilar y ejecutar el ejemplo anterior es el siguiente:
Fri Jan 08 09:48:47 CST 2016 Fri Jan 08 09:48:50 CST 2016 Difference is : 3019
Clase Calendar
Ahora ya podemos formatear y crear un objeto Date, pero ¿cómo podemos establecer y obtener partes específicas de los datos de fecha, como la hora, el día o los minutos? ¿Y cómo podemos sumar o restar valores a estas partes de la fecha? La respuesta es usar la clase Calendar.
La clase Calendar es mucho más potente que la clase Date, y también es más compleja en su implementación.
La clase Calendar es una clase abstracta; en la práctica se implementan objetos de una subclase específica. El proceso de creación de objetos es transparente para el programador, solo necesita usar el método getInstance.
Crear un objeto Calendar que represente la fecha actual del sistema
Calendar c = Calendar.getInstance();//默认是当前日期
Crear un objeto Calendar con una fecha específica
Para usar la clase Calendar y representar un tiempo específico, primero se debe crear un objeto Calendar y luego establecer los parámetros de año, mes y día en ese objeto.
//创建一个代表2009年6月12日的Calendar对象 Calendar c1 = Calendar.getInstance(); c1.set(2009, 6 - 1, 12);
Tipos de campos de los objetos de la clase Calendar
En la clase Calendar se utilizan las siguientes constantes con diferentes significados; muchas clases dentro del JDK adoptan esta misma idea.
| Constante | Descripción |
|---|---|
| Calendar.YEAR | Año |
| Calendar.MONTH | Mes |
| Calendar.DATE | Fecha |
| Calendar.DAY_OF_MONTH | Fecha, con exactamente el mismo significado que el campo anterior. |
| Calendar.HOUR | Hora en formato de 12 horas. |
| Calendar.HOUR_OF_DAY | Hora en formato de 24 horas. |
| Calendar.MINUTE | Minuto |
| Calendar.SECOND | segundo |
| Calendar.DAY_OF_WEEK | Día de la semana |
Configuración de información de los objetos de la clase Calendar
Configuración con Set
Por ejemplo:
Calendar c1 = Calendar.getInstance();
Llamada:
public final void set(int year,int month,int date)
c1.set(2009, 6, 12);//把Calendar对象c1的年月日分别设这为:2009、6、12
Configuración mediante el tipo de campo.
Si solo se establece un campo, por ejemplo el valor de la fecha, se puede usar el siguiente método set:
public void set(int field,int value)
Establece la fecha representada por el objeto c1 al día 10; todos los demás valores se recalculan.
c1.set(Calendar.DATE,10);
Establece el año representado por el objeto c1 a 2008; todos los demás valores se recalculan.
c1.set(Calendar.YEAR,2008);
El significado de set para otros campos se deduce de manera similar.
Configuración con Add
Calendar c1 = Calendar.getInstance();
Suma 10 a la fecha del objeto c1, es decir, c1 representa la fecha 10 días después; todos los demás valores se recalculan.
c1.add(Calendar.DATE, 10);
Resta 10 a la fecha del objeto c1, es decir, c1 representa la fecha 10 días antes; todos los demás valores se recalculan.
c1.add(Calendar.DATE, -10);
El significado de add para otros campos se deduce de manera similar.
Obtención de información de los objetos de la clase Calendar
Clase GregorianCalendar
La clase Calendar implementa el calendario gregoriano; GregorianCalendar es una implementación concreta de la clase Calendar.
El método getInstance() de Calendar devuelve un objeto GregorianCalendar inicializado por defecto con la configuración regional y la zona horaria actuales. GregorianCalendar define dos campos: AD y BC. Estos representan las dos eras definidas por el calendario gregoriano.
A continuación se enumeran varios constructores del objeto GregorianCalendar:
| N.º | Constructor y descripción |
| 1 |
GregorianCalendar() Construye un GregorianCalendar predeterminado usando la hora actual en la zona horaria predeterminada con la configuración regional predeterminada. |
| 2 |
GregorianCalendar(int year, int month, int date) Construye un GregorianCalendar con la fecha dada en la zona horaria predeterminada con la configuración regional predeterminada. |
| 3 |
GregorianCalendar(int year, int month, int date, int hour, int minute) Construye un GregorianCalendar con la fecha y hora dadas para la zona horaria predeterminada con la configuración regional predeterminada. |
| 4 |
GregorianCalendar(int year, int month, int date, int hour, int minute, int second) Construye un GregorianCalendar con la fecha y hora dadas para la zona horaria predeterminada con la configuración regional predeterminada. |
| 5 |
GregorianCalendar(Locale aLocale) Construye un GregorianCalendar basado en la hora actual en la zona horaria predeterminada con la configuración regional dada. |
| 6 |
GregorianCalendar(TimeZone zone) Construye un GregorianCalendar basado en la hora actual en la zona horaria dada con la configuración regional predeterminada. |
| 7 |
GregorianCalendar(TimeZone zone, Locale aLocale) Construye un GregorianCalendar basado en la hora actual en la zona horaria dada con la configuración regional dada. |
Aquí hay una lista de algunos métodos útiles proporcionados por la clase GregorianCalendar:
| N.º | Método y descripción |
| 1 |
void add(int field, int amount) Agrega la cantidad de tiempo especificada (con signo) al campo de calendario dado según las reglas del calendario. |
| 2 |
protected void computeFields() Convierte los milisegundos UTC en valores de campo de tiempo. |
| 3 |
protected void computeTime() Sobrescribe Calendar, convierte los valores de campo de tiempo a milisegundos UTC. |
| 4 |
boolean equals(Object obj) Compara este GregorianCalendar con el Object especificado. |
| 5 |
int get(int field) Obtiene el valor de tiempo del campo especificado. |
| 6 |
int getActualMaximum(int field) Devuelve el valor máximo del campo dado para la fecha actual. |
| 7 |
int getActualMinimum(int field) Devuelve el valor mínimo del campo dado para la fecha actual. |
| 8 |
int getGreatestMinimum(int field) Devuelve el mínimo más alto del campo de calendario dado para esta instancia de GregorianCalendar. |
| 9 |
Date getGregorianChange() Obtiene la fecha de cambio del calendario gregoriano. |
| 10 |
int getLeastMaximum(int field) Devuelve el máximo más bajo del campo de calendario dado para esta instancia de GregorianCalendar. |
| 11 |
int getMaximum(int field) Devuelve el valor máximo del campo de calendario dado para esta instancia de GregorianCalendar. |
| 12 |
Date getTime() Obtiene la hora actual del calendario. |
| 13 |
long getTimeInMillis() Obtiene la hora actual del calendario representada como un long. |
| 14 |
TimeZone getTimeZone() Obtiene la zona horaria. |
| 15 |
int getMinimum(int field) Devuelve el valor mínimo del campo dado. |
| 16 |
int hashCode() Sobrescribe hashCode. |
| 17 |
boolean isLeapYear(int year) Determina si el año dado es bisiesto. |
| 18 |
void roll(int field, boolean up) Agrega o resta (arriba/abajo) una sola unidad de tiempo en el campo de tiempo dado, sin cambiar los campos mayores. |
| 19 |
void set(int field, int value) Establece el campo de tiempo con el valor dado. |
| 20 |
void set(int year, int month, int date) Establece los valores de año, mes y día. |
| 21 |
void set(int year, int month, int date, int hour, int minute) Establece los valores de año, mes, día, hora y minuto. |
| 22 |
void set(int year, int month, int date, int hour, int minute, int second) Establece los valores de año, mes, día, hora, minuto y segundo. |
| 23 |
void setGregorianChange(Date date) Establece la fecha de cambio del GregorianCalendar. |
| 24 |
void setTime(Date date) Establece la hora actual del Calendar con la fecha dada. |
| 25 |
void setTimeInMillis(long millis) Establece la hora actual del Calendar con el valor long de milisegundos dado. |
| 26 |
void setTimeZone(TimeZone value) Establece la zona horaria actual con el valor de zona horaria dado. |
| 27 |
String toString() Devuelve la cadena que representa el calendario. |
Ejemplo
Ejemplo
El resultado de compilar y ejecutar el ejemplo anterior es el siguiente:
Date: Apr 22 2009 Time: 11:25:27 当前年份不是闰年
Para la lista completa de la clase Calendar, puedes consultar la documentación estándar deJava。
Otras extensiones