Получение числового значения месяца из Date в Java
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы извлечь номер месяца из объекта Date
, примените класс Calendar
:
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
:
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue(); // Теперь добавлять 1 не нужно, выводит от 1 до 12.
Отнюдь логичней и понятней, когда январь обозначается как 1
, а декабрь — как 12
.
Внимание к времени
Часовые пояса— источник потенциальных проблем
При работе с java.time
всегда учитывайте часовой пояс:
Instant instant = new Date().toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.of("Europe/Paris"));
int month = zdt.getMonthValue(); // Вот как часовой пояс может всё измениить.
Номер месяца будет зависеть от выбранного часового пояса.
Часовой пояс и базы данных — прекрасная комбинация
Java 8 и java.time
отлично согласуются с базами данных, просто обмениваясь данными о датах и времени:
// Работа с 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?
Несомненно, особенно если нужно обращаться со старым кодом:
Date legacyDate = new Date();
Instant instantFromLegacy = legacyDate.toInstant();
ZonedDateTime zdtFromLegacy = instantFromLegacy.atZone(ZoneId.systemDefault());
int monthOfLegacyDate = zdtFromLegacy.getMonthValue(); // Старую дату можно легко преобразовать в новый формат.
Этот пример демонстрирует переход с java.util.Date
на более современный и надежный java.time
.
Визуализация
Попробуйте представить календарный год в виде циферблата:
📅
Январь (1)
/ \
Декабрь (12) Февраль (2)
\ /
...(месяцы)...
Использование Java для извлечения месяца из даты:
Date date = new Date(); // 📅 Дана дата
Calendar cal = Calendar.getInstance();
cal.setTime(date); // 🔄 Календарь настроен
int month = cal.get(Calendar.MONTH) + 1; // 🎯 Получаем месяц (не забываем про +1)
И визуально это выглядит так:
📅 -> 🔄 -> 🎯: [2] // Допустим, что сейчас февраль.
За рамками основ
Говорящие само за себя перечисления Month
Перечисление Month
в Java представляет из себя удобное описание месяцев:
Month monthEnum = LocalDate.now().getMonth();
int monthNumber = monthEnum.getValue(); // Просто и красиво.
Для тех, кто ещё на Java 7 или ниже: библиотека Joda-Time
В версиях до Java 8 можно использовать Joda-Time:
DateTime dt = new DateTime();
int month = dt.getMonthOfYear(); // Немного старомодно, но работает надёжно.
Joda-Time вдохновил создателей Date-Time API в Java 8.
Форматирование месяца как строки
Иногда уместнее отформатировать месяц в виде строки:
DateTimeFormatter f = DateTimeFormatter.ofPattern("MM");
String monthString = zonedDateTime.format(f); // Получим "02" для февраля.
Примите во внимание возможные проблемы
Вопрос с нумерацией месяцев от нуля
Использование Calendar.MONTH
, начинающего с нуля, может привести к ошибке с неправильным смещением. Сфокусируйте своё внимание!
Изменяемость даты и времени: требует бдительности
Изменяемость Calendar
и java.util.Date
иногда создаёт проблемы. Неизменяемость классов в java.time
является гарантированным фактором их надежности и предсказуемости.
Полезные материалы
- Calendar (Java Platform SE 8) — Официальная документация класса Calendar.
- Java SE 8 Date and Time — Всё о Date and Time API Java 8.
- SimpleDateFormat (Java Platform SE 8) — Как форматировать и парсить даты в Java.
- Java 8 Date – LocalDate, LocalDateTime, Instant — Справочное руководство по Date и Time классам в Java 8.
- java – How to determine day of week by passing specific date? — Обсуждение схожих вопросов на Stack Overflow.