Работа с датами
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
public class DateTimeExample {
public static void main(String[] args) {
// 1. Современный подход (java.time.*)
System.out.println("=== Современный подход (java.time) ===");
// LocalDate - работа с датами без времени
LocalDate today = LocalDate.now();
System.out.println("Сегодня: " + today);
LocalDate specificDate = LocalDate.of(2024, 3, 15);
System.out.println("Специфическая дата: " + specificDate);
// LocalTime - работа со временем без даты
LocalTime currentTime = LocalTime.now();
System.out.println("Текущее время: " + currentTime);
LocalTime specificTime = LocalTime.of(13, 30, 0);
System.out.println("Специфическое время: " + specificTime);
// LocalDateTime - работа с датой и временем
LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println("Текущие дата и время: " + currentDateTime);
// 2. Форматирование дат
System.out.println("\n=== Форматирование дат ===");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");
String formattedDateTime = currentDateTime.format(formatter);
System.out.println("Отформатированные дата и время: " + formattedDateTime);
// Парсинг строки в дату
String dateStr = "15.03.2024 14:30:00";
LocalDateTime parsedDateTime = LocalDateTime.parse(dateStr, formatter);
System.out.println("Распарсенная дата: " + parsedDateTime);
// 3. Операции с датами
System.out.println("\n=== Операции с датами ===");
// Добавление и вычитание
LocalDate futureDate = today.plusDays(30);
System.out.println("Дата через 30 дней: " + futureDate);
LocalDate pastDate = today.minusMonths(1);
System.out.println("Дата месяц назад: " + pastDate);
// Разница между датами
Period period = Period.between(pastDate, today);
System.out.println("Период между датами: " +
period.getYears() + " лет, " +
period.getMonths() + " месяцев, " +
period.getDays() + " дней");
// 4. Работа с часовыми поясами
System.out.println("\n=== Работа с часовыми поясами ===");
ZonedDateTime moscowTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow"));
System.out.println("Время в Москве: " + moscowTime.format(formatter));
ZonedDateTime newYorkTime = moscowTime.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println("Время в Нью-Йорке: " + newYorkTime.format(formatter));
// 5. Сравнение дат
System.out.println("\n=== Сравнение дат ===");
LocalDate date1 = LocalDate.of(2024, 1, 1);
LocalDate date2 = LocalDate.of(2024, 12, 31);
System.out.println("date1 раньше date2: " + date1.isBefore(date2));
System.out.println("date1 после date2: " + date1.isAfter(date2));
System.out.println("Разница в днях: " + ChronoUnit.DAYS.between(date1, date2));
// 6. Устаревший подход (для поддержки legacy кода)
System.out.println("\n=== Устаревший подход ===");
// Date (устаревший)
Date legacyDate = new Date();
System.out.println("Старый Date: " + legacyDate);
// Calendar (устаревший)
Calendar calendar = Calendar.getInstance();
calendar.set(2024, Calendar.MARCH, 15);
System.out.println("Старый Calendar: " + calendar.getTime());
// Конвертация между старым и новым API
LocalDateTime modernDateTime = LocalDateTime.ofInstant(legacyDate.toInstant(), ZoneId.systemDefault());
Date legacyDateTime = Date.from(currentDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
}
Давайте разберем основные моменты работы с датами в Java:
- Основные классы современного API (java.time.*):
- LocalDate - для работы только с датой
- LocalTime - для работы только со временем
- LocalDateTime - для работы с датой и временем
- ZonedDateTime - для работы с датой, временем и часовым поясом
- Instant - для работы с метками времени
- Duration - для работы с продолжительностью
-
Period - для работы с периодами
-
Преимущества современного API:
- Потокобезопасность (все классы иммутабельные)
- Четкое разделение между датами, временем и временными метками
- Поддержка часовых поясов
-
Удобные методы для операций с датами
-
Основные операции:
- Создание дат (now(), of())
- Форматирование (DateTimeFormatter)
- Парсинг строк в даты
- Арифметические операции (plus, minus)
- Сравнение дат
-
Получение разницы между датами
-
Работа с часовыми поясами:
- ZoneId для определения часового пояса
- ZonedDateTime для работы с датами в разных часовых поясах
-
Конвертация между часовыми поясами
-
Устаревшие классы (не рекомендуется использовать в новом коде):
- java.util.Date
- java.util.Calendar
-
java.text.SimpleDateFormat
-
Форматирование дат:
- Использование предопределенных форматов
- Создание пользовательских форматов
- Локализация форматов
[[Programming/java/1. osnovi/Тема 4. Наследование/Урок 5. Работа с датами/задание|задание]]