Работа с датами в Java: обзор библиотек и инструментов

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с датами в Java: библиотеки и инструменты

Работа с датами и временем — одна из ключевых задач в любом приложении. В Java долгое время стандартные классы java.util.Date и java.util.Calendar вызывали критику из-за неудобства, мутабельности и плохой поддержки часовых поясов. Однако с выходом Java 8 ситуация кардинально изменилась. В этой статье мы разберём основные библиотеки и инструменты для работы с датами в Java, которые помогут вам писать чистый и надёжный код.

1. Стандартная библиотека java.time (Java 8+)

Начиная с Java 8, разработчикам доступен мощный пакет java.time, основанный на стандарте ISO-8601. Это рекомендуемый способ работы с датами и временем. Основные классы:

  • LocalDate — дата без времени (год, месяц, день).
  • LocalTime — время без даты (часы, минуты, секунды, наносекунды).
  • LocalDateTime — комбинация даты и времени.
  • ZonedDateTime — дата и время с учётом часового пояса.
  • Instant — момент в UTC (для машинного времени).
  • Duration и Period — для работы с интервалами.

Пример: создание и форматирование даты

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class DateExample {
    public static void main(String[] args) {
        // Текущая дата
        LocalDate today = LocalDate.now();
        System.out.println("Сегодня: " + today);

        // Создание конкретной даты
        LocalDate birthDate = LocalDate.of(1990, 5, 15);
        System.out.println("Дата рождения: " + birthDate);

        // Форматирование
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        String formatted = birthDate.format(formatter);
        System.out.println("Форматированная дата: " + formatted);

        // Парсинг строки
        String dateStr = "2023-12-31";
        LocalDate parsedDate = LocalDate.parse(dateStr);
        System.out.println("Распарсено: " + parsedDate);
    }
}

Пример: вычисление разницы между датами

import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;

public class DateDifference {
    public static void main(String[] args) {
        LocalDate start = LocalDate.of(2020, 1, 1);
        LocalDate end = LocalDate.of(2024, 3, 15);

        Period period = Period.between(start, end);
        System.out.println("Разница: " + period.getYears() + " лет, " +
                           period.getMonths() + " месяцев, " +
                           period.getDays() + " дней");

        long daysBetween = ChronoUnit.DAYS.between(start, end);
        System.out.println("Всего дней: " + daysBetween);
    }
}

2. Joda-Time (для старых версий Java)

До появления java.time де-факто стандартом была библиотека Joda-Time. Она предоставляла удобные immutable-классы и поддержку часовых поясов. Если вы работаете с Java 7 или ниже, Joda-Time — отличный выбор.

Подключение (Maven):

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.12.7</version>
</dependency>

Пример: работа с Joda-Time

import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class JodaExample {
    public static void main(String[] args) {
        // Текущая дата и время
        DateTime now = new DateTime();
        System.out.println("Сейчас: " + now);

        // Создание даты
        DateTime specificDate = new DateTime(2024, 1, 15, 10, 30, 0);
        System.out.println("Конкретная дата: " + specificDate);

        // Форматирование
        DateTimeFormatter fmt = DateTimeFormat.forPattern("dd.MM.yyyy HH:mm");
        System.out.println("Форматировано: " + specificDate.toString(fmt));

        // Разница в днях
        DateTime start = new DateTime(2023, 1, 1, 0, 0);
        DateTime end = new DateTime(2024, 1, 1, 0, 0);
        int days = Days.daysBetween(start, end).getDays();
        System.out.println("Дней между: " + days);
    }
}

3. ThreeTen-Extra (расширение для java.time)

Библиотека ThreeTen-Extra добавляет дополнительные классы, не вошедшие в стандартный java.time, например:

  • Interval

Рекомендаций