Класс 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);
Получение информации о дате и времени
Пример
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); // Получить секунду
Установка даты и времени
Пример
// Установить год
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
Вычисление даты
Пример
// Добавить 10 дней
calendar.add(Calendar.DAY_OF_MONTH, 10);
// Вычесть 2 месяца
calendar.add(Calendar.MONTH, -2);
Сравнение дат
Пример
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
Пример
Date date = calendar.getTime();
Установка из объекта Date
Пример
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
Форматирование вывода даты
Сам GregorianCalendar не предоставляет методов форматирования, но его можно использовать вместе с SimpleDateFormat:
Пример
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.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 |