LocalDate / LocalTime / LocalDateTime

С Java 8 в пакете java.time появился новый API даты и времени, заменяющий устаревшие Date и Calendar. Три ключевых класса:

  • LocalDate — календарная дата без времени и часового пояса (например, 2026-05-15).

  • LocalTime — время в течение суток без даты (например, 14:30:00).

  • LocalDateTime — комбинация даты и времени, тоже без часового пояса.

Все три класса неизменяемы (immutable) и потокобезопасны. Любая «модификация» возвращает новый объект.

Зачем нужны

  • Хранение и арифметика дат: возраст, длительность, дедлайны.

  • Форматирование и парсинг строк с помощью DateTimeFormatter.

  • Логирование событий и формирование отчётов с человекочитаемыми датами.

Способы создания

  • LocalDate.now() / LocalTime.now() / LocalDateTime.now() — текущие значения.

  • LocalDate.of(int year, int month, int day).

  • LocalTime.of(int hour, int minute[, int second]).

  • LocalDateTime.of(int y, int mo, int d, int h, int mi[, int s]).

  • LocalDate.parse("2026-05-15"), LocalTime.parse("14:30:00"), LocalDateTime.parse("2026-05-15T14:30").

  • LocalDateTime.of(LocalDate date, LocalTime time) — собрать из двух частей.

Популярные методы

  • getYear(), getMonth(), getMonthValue(), getDayOfMonth(), getDayOfWeek().

  • getHour(), getMinute(), getSecond() (у времени).

  • plusDays(n), plusMonths(n), plusYears(n), minusDays(n) и т.п.

  • isBefore(other), isAfter(other), isEqual(other).

  • withYear(int), withMonth(int), withDayOfMonth(int) — копия с заменой компонента.

  • format(DateTimeFormatter), DateTimeFormatter.ofPattern("...").

  • LocalDate.atTime(LocalTime), LocalDateTime.toLocalDate(), LocalDateTime.toLocalTime().

Пример 1. Текущая дата и время

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class NowDemo {
    public static void main(String[] args) {
        System.out.println("Дата:        " + LocalDate.now());
        System.out.println("Время:       " + LocalTime.now());
        System.out.println("Дата и время:" + LocalDateTime.now());
    }
}

Вывод (зависит от системного времени):

Дата:        2026-05-15
Время:       14:32:08.123456
Дата и время:2026-05-15T14:32:08.123456

Пример 2. Создание конкретных значений

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class CreateValues {
    public static void main(String[] args) {
        LocalDate d = LocalDate.of(2026, 9, 1);
        LocalTime t = LocalTime.of(9, 0);
        LocalDateTime dt = LocalDateTime.of(d, t);
        System.out.println(d);
        System.out.println(t);
        System.out.println(dt);
    }
}

Вывод:

2026-09-01
09:00
2026-09-01T09:00

Пример 3. Арифметика дат

import java.time.LocalDate;

public class DateMath {
    public static void main(String[] args) {
        LocalDate start = LocalDate.of(2026, 1, 1);
        System.out.println("+30 дней: " + start.plusDays(30));
        System.out.println("+1 месяц: " + start.plusMonths(1));
        System.out.println("+1 год:   " + start.plusYears(1));
        System.out.println("-10 дней: " + start.minusDays(10));
    }
}

Вывод:

+30 дней: 2026-01-31
+1 месяц: 2026-02-01
+1 год:   2027-01-01
-10 дней: 2025-12-22

Пример 4. Получение компонентов даты

import java.time.LocalDate;
import java.time.DayOfWeek;

public class DateParts {
    public static void main(String[] args) {
        LocalDate d = LocalDate.of(2026, 5, 15);
        System.out.println("Год:        " + d.getYear());
        System.out.println("Месяц:      " + d.getMonthValue());
        System.out.println("День:       " + d.getDayOfMonth());
        DayOfWeek dow = d.getDayOfWeek();
        System.out.println("День недели:" + dow);
    }
}

Вывод:

Год:        2026
Месяц:      5
День:       15
День недели:FRIDAY

Пример 5. Сравнение дат

import java.time.LocalDate;

public class CompareDates {
    public static void main(String[] args) {
        LocalDate a = LocalDate.of(2026, 5, 15);
        LocalDate b = LocalDate.of(2026, 9, 1);
        System.out.println(a.isBefore(b));
        System.out.println(a.isAfter(b));
        System.out.println(a.isEqual(LocalDate.of(2026, 5, 15)));
    }
}

Вывод:

true
false
true

Пример 6. Парсинг строки

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

public class ParseDemo {
    public static void main(String[] args) {
        LocalDate iso = LocalDate.parse("2026-05-15");
        System.out.println(iso);

        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        LocalDate custom = LocalDate.parse("15.05.2026", fmt);
        System.out.println(custom);
    }
}

Вывод:

2026-05-15
2026-05-15

Пример 7. Форматирование под отчёт

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class FormatDemo {
    public static void main(String[] args) {
        LocalDateTime dt = LocalDateTime.of(2026, 5, 15, 14, 30);
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
        System.out.println(dt.format(fmt));

        DateTimeFormatter log = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss");
        System.out.println("log_" + dt.format(log) + ".txt");
    }
}

Вывод:

15.05.2026 14:30
log_2026-05-15_14-30-00.txt

Пример 8. Возраст в днях между двумя датами

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

public class AgeInDays {
    public static void main(String[] args) {
        LocalDate birth = LocalDate.of(2010, 9, 1);
        LocalDate today = LocalDate.of(2026, 5, 15);
        long days = ChronoUnit.DAYS.between(birth, today);
        long years = ChronoUnit.YEARS.between(birth, today);
        System.out.println("Прошло дней: " + days);
        System.out.println("Полных лет:  " + years);
    }
}

Вывод:

Прошло дней: 5735
Полных лет:  15

См. также

Примечание

Описание основано на официальной документации Oracle Java SE 21 API (https://docs.oracle.com/en/java/javase/21/docs/api/). Материал распространяется на условиях Oracle Free Documentation License. Тексты статьи написаны редакцией AlashEd своими словами; примеры кода — авторские.