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

// Crear una instancia que representa la fecha y hora actuales
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

GregorianCalendar calendar = new GregorianCalendar();

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

GregorianCalendar calendar = new GregorianCalendar();

// 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

GregorianCalendar calendar = new GregorianCalendar(2023, Calendar.NOVEMBER, 15);

// Aumentar 10 días
calendar.add(Calendar.DAY_OF_MONTH, 10);

// Reducir 2 meses
calendar.add(Calendar.MONTH, -2);

Comparar fechas

Ejemplo

GregorianCalendar cal1 = new GregorianCalendar(2023, Calendar.NOVEMBER, 15);
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

// Determinar si el año especificado es bisiesto
boolean isLeapYear = new GregorianCalendar().isLeapYear(2024);

Convertir a objeto Date

Ejemplo

GregorianCalendar calendar = new GregorianCalendar();
Date date = calendar.getTime();

Establecer desde objeto Date

Ejemplo

Date date = new Date();
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

GregorianCalendar calendar = new GregorianCalendar(2023, Calendar.NOVEMBER, 15, 14, 30);
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

// No recomendado
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.GregorianCalendar;
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
Otras extensiones