ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку
logo

Получение числового значения месяца из Date в Java

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы извлечь номер месяца из объекта Date, примените класс Calendar:

Java
Скопировать код
Calendar cal = Calendar.getInstance();
cal.setTime(new Date()); // Задайте свою дату здесь
int month = cal.get(Calendar.MONTH) + 1; // Добавляем 1, так как в Calendar месяцы считаются с 0.

Не забывайте добавлять 1, поскольку в Calendar.MONTH нумерация месяцев начинается с нуля.

Использование Date-Time API в Java 8

В Java 8 был введен новый Date-Time API. Вот пример извлечения номера месяца с помощью java.util.Date:

Java
Скопировать код
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue(); // Теперь добавлять 1 не нужно, выводит от 1 до 12.

Отнюдь логичней и понятней, когда январь обозначается как 1, а декабрь — как 12.

Внимание к времени

Часовые пояса— источник потенциальных проблем

При работе с java.time всегда учитывайте часовой пояс:

Java
Скопировать код
Instant instant = new Date().toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.of("Europe/Paris"));
int month = zdt.getMonthValue(); // Вот как часовой пояс может всё измениить.

Номер месяца будет зависеть от выбранного часового пояса.

Часовой пояс и базы данных — прекрасная комбинация

Java 8 и java.time отлично согласуются с базами данных, просто обмениваясь данными о датах и времени:

Java
Скопировать код
// Работа с JDBC
PreparedStatement pstmt = con.prepareStatement("INSERT INTO events (event_date) VALUES (?)");
pstmt.setObject(1, localDate);
ResultSet rs = stmt.executeQuery("SELECT event_date FROM events");
LocalDate eventDate = rs.getObject("event_date", LocalDate.class); // База данных и Java работают вместе гладко.

Таким образом, взаимодействие с данными становится лёгким и эффективным.

Работа со старым классом Date

Может ли java.util.Date работать совместно с java.time?

Несомненно, особенно если нужно обращаться со старым кодом:

Java
Скопировать код
Date legacyDate = new Date();
Instant instantFromLegacy = legacyDate.toInstant();
ZonedDateTime zdtFromLegacy = instantFromLegacy.atZone(ZoneId.systemDefault());
int monthOfLegacyDate = zdtFromLegacy.getMonthValue(); // ​Старую дату можно легко преобразовать в новый формат.

Этот пример демонстрирует переход с java.util.Date на более современный и надежный java.time.

Визуализация

Попробуйте представить календарный год в виде циферблата:

Markdown
Скопировать код
             📅
       Январь (1)
      /               \
Декабрь (12)     Февраль (2)
      \               /
           ...(месяцы)...

Использование Java для извлечения месяца из даты:

Java
Скопировать код
Date date = new Date();                   // 📅 Дана дата
Calendar cal = Calendar.getInstance();   
cal.setTime(date);                        // 🔄 Календарь настроен
int month = cal.get(Calendar.MONTH) + 1;  // 🎯 Получаем месяц (не забываем про +1)

И визуально это выглядит так:

Markdown
Скопировать код
📅 -> 🔄 -> 🎯: [2] // Допустим, что сейчас февраль.

За рамками основ

Говорящие само за себя перечисления Month

Перечисление Month в Java представляет из себя удобное описание месяцев:

Java
Скопировать код
Month monthEnum = LocalDate.now().getMonth();
int monthNumber = monthEnum.getValue(); // Просто и красиво.

Для тех, кто ещё на Java 7 или ниже: библиотека Joda-Time

В версиях до Java 8 можно использовать Joda-Time:

Java
Скопировать код
DateTime dt = new DateTime();
int month = dt.getMonthOfYear(); // Немного старомодно, но работает надёжно.

Joda-Time вдохновил создателей Date-Time API в Java 8.

Форматирование месяца как строки

Иногда уместнее отформатировать месяц в виде строки:

Java
Скопировать код
DateTimeFormatter f = DateTimeFormatter.ofPattern("MM");
String monthString = zonedDateTime.format(f); // Получим "02" для февраля.

Примите во внимание возможные проблемы

Вопрос с нумерацией месяцев от нуля

Использование Calendar.MONTH, начинающего с нуля, может привести к ошибке с неправильным смещением. Сфокусируйте своё внимание!

Изменяемость даты и времени: требует бдительности

Изменяемость Calendar и java.util.Date иногда создаёт проблемы. Неизменяемость классов в java.time является гарантированным фактором их надежности и предсказуемости.

Полезные материалы

  1. Calendar (Java Platform SE 8) — Официальная документация класса Calendar.
  2. Java SE 8 Date and Time — Всё о Date and Time API Java 8.
  3. SimpleDateFormat (Java Platform SE 8) — Как форматировать и парсить даты в Java.
  4. Java 8 Date – LocalDate, LocalDateTime, Instant — Справочное руководство по Date и Time классам в Java 8.
  5. java – How to determine day of week by passing specific date? — Обсуждение схожих вопросов на Stack Overflow.