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

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

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

Начать курс

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

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

1. java.time (JSR-310) — стандартный API

Начиная с Java 8, пакет java.time является основным инструментом для работы с датами и временем. Он был разработан под руководством Стивена Коулборна, автора Joda-Time, и вобрал в себя лучшие практики.

Ключевые классы:

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

Пример использования:

import java.time.*;
import java.time.format.DateTimeFormatter;

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

        // Создание конкретной даты
        LocalDate specificDate = LocalDate.of(2025, Month.MARCH, 15);
        System.out.println("Конкретная дата: " + specificDate);

        // Работа с временем
        LocalTime now = LocalTime.now();
        LocalTime meetingTime = LocalTime.of(14, 30);
        System.out.println("Время встречи: " + meetingTime);

        // Форматирование
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
        LocalDateTime event = LocalDateTime.of(2025, 12, 31, 23, 59);
        String formatted = event.format(formatter);
        System.out.println("Отформатировано: " + formatted);

        // Разница между датами
        Period period = Period.between(today, specificDate);
        System.out.println("Дней до 15 марта: " + period.getDays());
    }
}

Преимущества: встроен в JDK, потокобезопасен, иммутабельные объекты, богатый API, поддержка всех часовых поясов.

2. Joda-Time

До появления java.time именно Joda-Time была де-факто стандартом для работы с датами в Java. Сегодня её использование оправдано только в старых проектах (до Java 8), так как разработчики рекомендуют мигрировать на java.time.

Пример:

import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.LocalDate;

public class JodaTimeExample {
    public static void main(String[] args) {
        // Текущая дата
        LocalDate today = LocalDate.now();
        DateTime now = DateTime.now();

        // Разница между датами
        LocalDate start = new LocalDate(2025, 1, 1);
        LocalDate end = new LocalDate(2025, 12, 31);
        int days = Days.daysBetween(start, end).getDays();
        System.out.println("Дней между: " + days);
    }
}

Недостатки: требует внешней зависимости, не обновляется активно, уступает java.time по функционалу.

3. Apache Commons Lang 3

Библиотека org.apache.commons.lang3.time предоставляет удобные утилиты для работы с датами, особенно для форматирования, парсинга и вычислений.

Популярные классы:

  • DateUtils — методы для округления, усечения, сравнения дат.
  • DateFormatUtils — форматирование дат в различные паттерны.
  • FastDateFormat — потокобезопасный форматтер.

Пример:

import org.apache.commons.lang3.time.DateUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.util.Date;

public class CommonsLangExample {
    public static void main(String[] args) {
        Date now = new Date();

        // Добавление дней
        Date nextWeek = DateUtils.addDays(now, 7);
        System.out.println("Через неделю: " + nextWeek);

        // Форматирование
        String formatted = DateFormatUtils.format(now, "yyyy-MM-dd HH:mm:ss");
        System.out.println("Формат: " + formatted);

        // Усечение до дня
        Date truncated = DateUtils.truncate(now, java.util.Calendar.DAY_OF                    

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