Работа с датами

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:

  1. Основные классы современного API (java.time.*):
  2. LocalDate - для работы только с датой
  3. LocalTime - для работы только со временем
  4. LocalDateTime - для работы с датой и временем
  5. ZonedDateTime - для работы с датой, временем и часовым поясом
  6. Instant - для работы с метками времени
  7. Duration - для работы с продолжительностью
  8. Period - для работы с периодами

  9. Преимущества современного API:

  10. Потокобезопасность (все классы иммутабельные)
  11. Четкое разделение между датами, временем и временными метками
  12. Поддержка часовых поясов
  13. Удобные методы для операций с датами

  14. Основные операции:

  15. Создание дат (now(), of())
  16. Форматирование (DateTimeFormatter)
  17. Парсинг строк в даты
  18. Арифметические операции (plus, minus)
  19. Сравнение дат
  20. Получение разницы между датами

  21. Работа с часовыми поясами:

  22. ZoneId для определения часового пояса
  23. ZonedDateTime для работы с датами в разных часовых поясах
  24. Конвертация между часовыми поясами

  25. Устаревшие классы (не рекомендуется использовать в новом коде):

  26. java.util.Date
  27. java.util.Calendar
  28. java.text.SimpleDateFormat

  29. Форматирование дат:

  30. Использование предопределенных форматов
  31. Создание пользовательских форматов
  32. Локализация форматов

[[Programming/java/1. osnovi/Тема 4. Наследование/Урок 5. Работа с датами/задание|задание]]