Clase Java GregorianCalendar
GregorianCalendar es una clase de calendario en Java que representa el calendario gregoriano. Hereda de la clase Calendar. Esta clase proporciona el sistema de calendario estándar, que es el utilizado por la mayoría de los países del mundo.
La clase GregorianCalendar se encuentra en el paquete java.util y se utiliza para manejar operaciones relacionadas con la fecha y la hora. Admite el cálculo de fechas desde el año 1 d.C. hasta el futuro, y tiene en cuenta reglas complejas del calendario como los años bisiestos.
Uso básico de GregorianCalendar
Crear una instancia de GregorianCalendar
Hay varias formas de crear una instancia de GregorianCalendar:
Ejemplo
GregorianCalendar calendar1 = new GregorianCalendar();
// Crear una instancia con año, mes y día especificados
// Nota: los meses comienzan desde 0, 0 representa enero
GregorianCalendar calendar2 = new GregorianCalendar(2023, 10, 15);
// Crear una instancia con año, mes, día, hora y minuto especificados
GregorianCalendar calendar3 = new GregorianCalendar(2023, 10, 15, 14, 30);
// Crear una instancia con año, mes, día, hora, minuto y segundo especificados
GregorianCalendar calendar4 = new GregorianCalendar(2023, 10, 15, 14, 30, 45);
Obtener información de fecha y hora
Ejemplo
int year = calendar.get(Calendar.YEAR); // Obtener el año
int month = calendar.get(Calendar.MONTH); // Obtener el mes (0-11)
int day = calendar.get(Calendar.DAY_OF_MONTH); // Obtener el día
int hour = calendar.get(Calendar.HOUR_OF_DAY); // Obtener la hora (formato de 24 horas)
int minute = calendar.get(Calendar.MINUTE); // Obtener el minuto
int second = calendar.get(Calendar.SECOND); // Obtener el segundo
Establecer fecha y hora
Ejemplo
// Establecer el año
calendar.set(Calendar.YEAR, 2024);
// Establecer el mes (0-11)
calendar.set(Calendar.MONTH, Calendar.JANUARY);
// Establecer el día
calendar.set(Calendar.DAY_OF_MONTH, 1);
// Establecer año, mes y día a la vez
calendar.set(2024, Calendar.JANUARY, 1);
Métodos comunes de GregorianCalendar
Cálculo de fechas
Ejemplo
// Aumentar 10 días
calendar.add(Calendar.DAY_OF_MONTH, 10);
// Reducir 2 meses
calendar.add(Calendar.MONTH, -2);
Comparar fechas
Ejemplo
GregorianCalendar cal2 = new GregorianCalendar(2023, Calendar.DECEMBER, 25);
// Comparar dos fechas
int result = cal1.compareTo(cal2); // cal1 antes que cal2 devuelve negativo, después devuelve positivo, igual devuelve 0
// Determinar si es antes de una fecha determinada
boolean isBefore = cal1.before(cal2);
// Determinar si es después de una fecha determinada
boolean isAfter = cal1.after(cal2);
Determinar año bisiesto
Ejemplo
boolean isLeapYear = new GregorianCalendar().isLeapYear(2024);
Convertir a objeto Date
Ejemplo
Date date = calendar.getTime();
Establecer desde objeto Date
Ejemplo
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
Salida formateada de fechas
GregorianCalendar no proporciona métodos de formato por sí mismo, pero se puede usar junto con SimpleDateFormat:
Ejemplo
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = sdf.format(calendar.getTime());
System.out.println(formattedDate); // Salida: 2023-11-15 14:30:00
Notas importantes
Los meses comienzan desde 0
En GregorianCalendar los meses comienzan desde 0, 0 representa enero y 11 representa diciembre. Para una mejor legibilidad del código, se recomienda usar las constantes definidas en la clase Calendar:
Ejemplo
new GregorianCalendar(2023, 10, 15);
// Recomendado
new GregorianCalendar(2023, Calendar.NOVEMBER, 15);
Seguridad de hilos
GregorianCalendar no es seguro para hilos. Si se necesita usar en un entorno multihilo, se debe realizar una sincronización o crear una instancia separada para cada hilo.
Alternativas
En Java 8 y versiones posteriores, se recomienda usar la nueva API de fecha y hora (clases del paquete java.time), como LocalDate, LocalDateTime, etc. Tienen un diseño más razonable y son más fáciles de usar.
Ejemplo completo
Ejemplo
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class GregorianCalendarExample {
public static void main(String[] args) {
// Crear una instancia de la fecha actual
GregorianCalendar calendar = new GregorianCalendar();
// Mostrar la fecha y hora actuales
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Hora actual: " + sdf.format(calendar.getTime()));
// Determinar si este año es bisiesto
int year = calendar.get(Calendar.YEAR);
boolean isLeap = calendar.isLeapYear(year);
System.out.println(year + " año" + (isLeap ? " es " : " no es ") + "año bisiesto");
// Aumentar 30 días
calendar.add(Calendar.DAY_OF_MONTH, 30);
System.out.println("Después de 30 días: " + sdf.format(calendar.getTime()));
// Crear una instancia de una fecha específica
GregorianCalendar birthday = new GregorianCalendar(1990, Calendar.JULY, 15);
System.out.println("Cumpleaños: " + sdf.format(birthday.getTime()));
}
}
El resultado de salida es:
当前时间: 2025-05-01 11:37:43 2025年不是闰年 30天后: 2025-05-31 11:37:43 生日: 1990-07-15 00:00:00
Resumen de métodos
GregorianCalendar es la clase de implementación concreta de Calendar. A continuación se muestran sus métodos comunes:
Constructores
| Método | Descripción |
|---|---|
GregorianCalendar() |
Crea un objeto usando la zona horaria y la configuración regional predeterminadas |
GregorianCalendar(int year, int month, int dayOfMonth) |
Crea un objeto con año, mes y día especificados |
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute) |
Crea un objeto con año, mes, día, hora y minuto especificados |
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second) |
Crea un objeto con año, mes, día, hora, minuto y segundo especificados |
GregorianCalendar(Locale locale) |
Crea un objeto con la zona horaria predeterminada y la configuración regional especificada |
GregorianCalendar(TimeZone zone) |
Crea un objeto con la zona horaria especificada y la configuración regional predeterminada |
GregorianCalendar(TimeZone zone, Locale locale) |
Crea un objeto con la zona horaria y la configuración regional especificadas |
Métodos específicos
| Método | Descripción |
|---|---|
boolean isLeapYear(int year) |
Determina si el año especificado es bisiesto |
void setGregorianChange(Date date) |
Establece la fecha de cambio del calendario juliano al gregoriano |
Date getGregorianChange() |
Obtiene la fecha de cambio del calendario juliano al gregoriano |
Métodos comunes heredados de Calendar
| Método | Descripción |
|---|---|
int get(int field) |
Obtiene el valor del campo especificado |
void set(int field, int value) |
Establece el valor del campo especificado |
void add(int field, int amount) |
Añade o resta la cantidad de tiempo especificada |
void roll(int field, int amount) |
Añade o resta la cantidad de tiempo sin cambiar los campos mayores |
boolean after(Object when) |
Determina si es después del tiempo especificado |
boolean before(Object when) |
Determina si es antes del tiempo especificado |
long getTimeInMillis() |
Devuelve el valor de tiempo (milisegundos) |
void setTimeInMillis(long millis) |
Establece el Calendar con el valor de tiempo en milisegundos |
Date getTime() |
Devuelve el objeto Date correspondiente |
void setTime(Date date) |
Establece el tiempo usando Date |
Constantes de campo (heredadas de Calendar)
| Campo | Descripción |
|---|---|
YEAR |
Campo del año |
MONTH |
Campo del mes (0-11) |
DATE / DAY_OF_MONTH |
Día del mes |
DAY_OF_WEEK |
Día de la semana (1-7, 1=domingo) |
HOUR |
Hora en formato de 12 horas |
HOUR_OF_DAY |
Hora en formato de 24 horas |
MINUTE |
Minuto |
SECOND |
segundo |
MILLISECOND |
Milisegundo |
AM_PM |
AM o PM |