Класс Java GregorianCalendar

GregorianCalendar — это класс календаря в Java, представляющий григорианский календарь и наследующий от класса Calendar. Этот класс предоставляет стандартную календарную систему, используемую большинством стран мира.

Класс GregorianCalendar находится в пакете java.util и используется для операций, связанных с датой и временем. Он поддерживает вычисления дат с 1 года н. э. и до будущих дат, а также учитывает сложные календарные правила, такие как високосные годы.


Основы использования GregorianCalendar

Создание экземпляра GregorianCalendar

Существует несколько способов создать экземпляр GregorianCalendar:

Пример

// Создать экземпляр, представляющий текущую дату и время
GregorianCalendar calendar1 = new GregorianCalendar();

// Создать экземпляр с указанными годом, месяцем и датой
// Примечание: месяцы начинаются с 0, 0 представляет январь
GregorianCalendar calendar2 = new GregorianCalendar(2023, 10, 15);

// Создать экземпляр с указанными годом, месяцем, датой, часом и минутой
GregorianCalendar calendar3 = new GregorianCalendar(2023, 10, 15, 14, 30);

// Создать экземпляр с указанными годом, месяцем, датой, часом, минутой и секундой
GregorianCalendar calendar4 = new GregorianCalendar(2023, 10, 15, 14, 30, 45);

Получение информации о дате и времени

Пример

GregorianCalendar calendar = new GregorianCalendar();

int year = calendar.get(Calendar.YEAR);       // Получить год
int month = calendar.get(Calendar.MONTH);    // Получить месяц (0-11)
int day = calendar.get(Calendar.DAY_OF_MONTH); // Получить дату
int hour = calendar.get(Calendar.HOUR_OF_DAY); // Получить час (24-часовой формат)
int minute = calendar.get(Calendar.MINUTE);   // Получить минуту
int second = calendar.get(Calendar.SECOND);   // Получить секунду

Установка даты и времени

Пример

GregorianCalendar calendar = new GregorianCalendar();

// Установить год
calendar.set(Calendar.YEAR, 2024);

// Установить месяц (0-11)
calendar.set(Calendar.MONTH, Calendar.JANUARY);

// Установить дату
calendar.set(Calendar.DAY_OF_MONTH, 1);

// Установить год, месяц и день одновременно
calendar.set(2024, Calendar.JANUARY, 1);

Общие методы GregorianCalendar

Вычисление даты

Пример

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

// Добавить 10 дней
calendar.add(Calendar.DAY_OF_MONTH, 10);

// Вычесть 2 месяца
calendar.add(Calendar.MONTH, -2);

Сравнение дат

Пример

GregorianCalendar cal1 = new GregorianCalendar(2023, Calendar.NOVEMBER, 15);
GregorianCalendar cal2 = new GregorianCalendar(2023, Calendar.DECEMBER, 25);

// Сравнить две даты
int result = cal1.compareTo(cal2);  // Возвращает отрицательное число, если cal1 находится перед cal2, положительное число, если после, и 0, если они равны

// Проверить, находится ли он перед определенной датой
boolean isBefore = cal1.before(cal2);

// Проверить, находится ли он после определенной даты
boolean isAfter = cal1.after(cal2);

Проверка високосного года

Пример

// Проверить, является ли указанный год високосным
boolean isLeapYear = new GregorianCalendar().isLeapYear(2024);

Преобразование в объект Date

Пример

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

Установка из объекта Date

Пример

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

Форматирование вывода даты

Сам GregorianCalendar не предоставляет методов форматирования, но его можно использовать вместе с SimpleDateFormat:

Пример

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);  // Вывод: 2023-11-15 14:30:00

Примечания

Месяцы начинаются с 0

В GregorianCalendar месяцы начинаются с 0, где 0 обозначает январь, а 11 — декабрь. Для лучшей читаемости кода рекомендуется использовать константы, определённые в классе Calendar:

Пример

// Не рекомендуется
new GregorianCalendar(2023, 10, 15);

// Рекомендуется
new GregorianCalendar(2023, Calendar.NOVEMBER, 15);

Потокобезопасность

GregorianCalendar не является потокобезопасным. Если его нужно использовать в многопоточной среде, следует выполнять синхронизацию или создавать отдельные экземпляры для каждого потока.

Альтернативы

В Java 8 и выше рекомендуется использовать новый API даты и времени (классы в пакете java.time), такие как LocalDate, LocalDateTime и т. д. Они имеют более продуманный дизайн, и их удобнее использовать.


Полный пример

Пример

import java.util.GregorianCalendar;
import java.util.Calendar;
import java.text.SimpleDateFormat;

public class GregorianCalendarExample {
    public static void main(String[] args) {
        // Создать экземпляр текущей даты
        GregorianCalendar calendar = new GregorianCalendar();
       
        // Отобразить текущую дату и время
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Текущее время: " + sdf.format(calendar.getTime()));
       
        // Проверить, является ли этот год високосным
        int year = calendar.get(Calendar.YEAR);
        boolean isLeap = calendar.isLeapYear(year);
        System.out.println(year + "год " + (isLeap ? " является" : " не является") + "високосным годом");
       
        // Добавить 30 дней
        calendar.add(Calendar.DAY_OF_MONTH, 30);
        System.out.println("30 дней спустя: " + sdf.format(calendar.getTime()));
       
        // Создать экземпляр конкретной даты
        GregorianCalendar birthday = new GregorianCalendar(1990, Calendar.JULY, 15);
        System.out.println("День рождения: " + sdf.format(birthday.getTime()));
    }
}

Результат вывода:

当前时间: 2025-05-01 11:37:43
2025年不是闰年
30天后: 2025-05-31 11:37:43
生日: 1990-07-15 00:00:00

Сводка методов

GregorianCalendar — конкретный класс реализации Calendar. Ниже перечислены его часто используемые методы:

Конструкторы

Метод Описание
GregorianCalendar() Создает объект, используя часовой пояс по умолчанию и локаль по умолчанию
GregorianCalendar(int year, int month, int dayOfMonth) Создает объект с указанными годом, месяцем и днем
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute) Создает объект с указанными годом, месяцем, днем, часом и минутой
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second) Создает объект с указанными годом, месяцем, днем, часом, минутой и секундой
GregorianCalendar(Locale locale) Создает объект, используя часовой пояс по умолчанию и указанную локаль
GregorianCalendar(TimeZone zone) Создает объект, используя указанный часовой пояс и локаль по умолчанию
GregorianCalendar(TimeZone zone, Locale locale) Создает объект, используя указанный часовой пояс и указанную локаль

Специфические методы

Метод Описание
boolean isLeapYear(int year) Определяет, является ли указанный год високосным
void setGregorianChange(Date date) Устанавливает дату перехода с юлианского календаря на григорианский
Date getGregorianChange() Возвращает дату перехода с юлианского календаря на григорианский

Общие методы, унаследованные от Calendar

Метод Описание
int get(int field) Возвращает значение указанного поля
void set(int field, int value) Устанавливает значение указанного поля
void add(int field, int amount) Добавляет или вычитает указанное количество времени
void roll(int field, int amount) Добавляет или вычитает время без изменения более крупных полей
boolean after(Object when) Определяет, является ли оно более поздним, чем указанное время
boolean before(Object when) Определяет, является ли оно более ранним, чем указанное время
long getTimeInMillis() Возвращает значение времени (в миллисекундах)
void setTimeInMillis(long millis) Устанавливает Calendar, используя значение времени в миллисекундах
Date getTime() Возвращает соответствующий объект Date
void setTime(Date date) Устанавливает время с помощью объекта Date

Константы полей (унаследованы от Calendar)

Поле Описание
YEAR Поле года
MONTH Поле месяца (0-11)
DATE / DAY_OF_MONTH День месяца
DAY_OF_WEEK День недели (1-7, 1=воскресенье)
HOUR Час в 12-часовом формате
HOUR_OF_DAY Час в 24-часовом формате
MINUTE Минута
SECOND second
MILLISECOND Миллисекунда
AM_PM AM или PM
Другие расширения