Открыть сервис

import java.time.LocalDateTime

LocalDateTime — это класс из стандартной библиотеки языка программирования Java (пакет java.time), представляющий дату и время без учёта часового пояса. Класс входит в состав модуля java.base и предназначен для работы с календарными датами и временем суток в формате «год-месяц-день-час-минута-секунда-наносекунда». Введён в Java 8 (2014 год) в рамках реформы API для работы с датой и временем, заменив устаревшие классы java.util.Date и java.util.Calendar.

История и предпосылки создания

До Java 8 работа с датами и временем осуществлялась с помощью классов java.util.Date и java.util.Calendar, которые имели ряд существенных недостатков: мутабельность (изменяемость объектов), неоднозначность в интерпретации месяцев (отсчёт от 0), отсутствие чёткого разделения между датой, временем и датой-временем, а также неудобный API для форматирования и парсинга. В 2007 году разработчик Стивен Коулборн предложил проект Joda-Time — стороннюю библиотеку, ставшую прототипом для нового официального API. В рамках Java Community Process (JSR-310) под руководством Коулборна был создан пакет java.time, включённый в Java 8. Класс LocalDateTime стал одним из ключевых элементов этого пакета.

Описание и структура

LocalDateTime объединяет два других класса: LocalDate (дата без времени) и LocalTime (время без даты). Внутренне объект хранит два поля: date типа LocalDate и time типа LocalTime. Класс является неизменяемым (immutable) и потокобезопасным — любое изменение возвращает новый объект, а не модифицирует существующий.

Основные поля и диапазоны значений

  • Год — от -999999999 до 999999999 (поддерживаются как до нашей эры, так и наша эра).
  • Месяц — от 1 до 12.
  • День месяца — от 1 до 28–31 в зависимости от месяца и года.
  • Часы — от 0 до 23.
  • Минуты — от 0 до 59.
  • Секунды — от 0 до 59 (с учётом високосной секунды — до 60, но на практике не используется).
  • Наносекунды — от 0 до 999999999.

Основные методы

Класс предоставляет более 80 методов, включая:

  • Фабричные методы создания: now(), of(int year, int month, int dayOfMonth, int hour, int minute), parse(CharSequence text).
  • Методы доступа: getYear(), getMonth(), getDayOfMonth(), getHour(), getMinute(), getSecond(), getNano().
  • Методы преобразования: toLocalDate(), toLocalTime(), atZone(ZoneId zone) (преобразует в ZonedDateTime).
  • Методы арифметики: plusDays(long days), minusHours(long hours), plus(long amountToAdd, TemporalUnit unit).
  • Методы сравнения: isBefore(LocalDateTime other), isAfter(LocalDateTime other), compareTo(LocalDateTime other).
  • Методы форматирования: format(DateTimeFormatter formatter).

Создание объекта

Объект LocalDateTime нельзя создать через конструктор (конструктор объявлен как private). Для создания используются статические фабричные методы:

now()

Возвращает текущие дату и время в системном часовом поясе (без сохранения зоны): ``java LocalDateTime now = LocalDateTime.now(); ``

of()

Позволяет задать дату и время явно. Существует несколько перегрузок: ``java LocalDateTime dt1 = LocalDateTime.of(2025, 3, 15, 14, 30); // 15 марта 2025, 14:30 LocalDateTime dt2 = LocalDateTime.of(2025, Month.MARCH, 15, 14, 30, 45, 123456789); // с секундами и наносекундами ``

parse()

Разбирает строку в формате ISO-8601 (yyyy-MM-dd'T'HH:mm:ss[.nnnnnnnnn]): ``java LocalDateTime dt = LocalDateTime.parse("2025-03-15T14:30:45.123456789"); ``

Арифметика и модификация

Все операции возвращают новый объект, не изменяя исходный. Основные методы:

  • plusDays(3) — добавить 3 дня.
  • minusHours(2) — вычесть 2 часа.
  • plusWeeks(1) — добавить неделю.
  • withYear(2026) — установить год 2026.
  • withDayOfMonth(1) — установить первое число месяца.
  • truncatedTo(ChronoUnit.HOURS) — отбросить минуты, секунды и наносекунды.

Метод plus(long amountToAdd, TemporalUnit unit) позволяет добавлять произвольные единицы времени: ``java LocalDateTime dt = LocalDateTime.now().plus(5, ChronoUnit.DAYS); ``

Сравнение объектов

Класс реализует интерфейс Comparable<LocalDateTime>, что позволяет сравнивать объекты естественным образом (по хронологическому порядку). Методы сравнения:

  • isBefore(other) — возвращает true, если дата-время предшествует other.
  • isAfter(other) — возвращает true, если следует после other.
  • equals(other) — сравнивает все поля (включая наносекунды).
  • compareTo(other) — возвращает отрицательное число, ноль или положительное.

Преобразование в другие типы

МетодРезультатОписание
toLocalDate()LocalDateИзвлекает только дату
toLocalTime()LocalTimeИзвлекает только время
atZone(ZoneId zone)ZonedDateTimeДобавляет часовой пояс
atOffset(ZoneOffset offset)OffsetDateTimeДобавляет смещение от UTC
toInstant(ZoneOffset offset)InstantПреобразует в момент времени (требуется смещение)

Форматирование и парсинг

Для форматирования используется класс DateTimeFormatter: ``java DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"); String formatted = LocalDateTime.now().format(formatter); // "15.03.2025 14:30:45" ` Для парсинга строки с произвольным форматом: `java LocalDateTime dt = LocalDateTime.parse("15.03.2025 14:30:45", formatter); ``

Ограничения и особенности

  • Отсутствие часового пояса: LocalDateTime не хранит информацию о часовом поясе или смещении от UTC. Это означает, что объект не привязан к конкретной точке на временной шкале. Например, 2025-03-15T14:30 может означать разное абсолютное время в разных регионах. Для работы с конкретными моментами времени следует использовать ZonedDateTime или Instant.
  • Не поддерживает високосные секунды: хотя спецификация ISO-8601 допускает 60-ю секунду, реализация Java игнорирует високосные секунды (значение 60 не генерируется).
  • Не является сериализуемым по умолчанию: для сериализации необходимо использовать toString() / parse() или сторонние библиотеки (Jackson, Gson с соответствующими модулями).
  • Поддержка эры: класс не хранит эру (до н.э./н.э.), но методы getEra() и withEra() доступны через наследование от TemporalAccessor.

Применение

LocalDateTime используется в ситуациях, где требуется хранить дату и время, но часовой пояс не важен или задаётся отдельно:

  • Логирование событийфиксация времени в локальной системе.
  • Календарные приложения — планирование встреч, задач, напоминаний (без привязки к зоне).
  • Бизнес-логика — расчёт сроков, периодов, интервалов.
  • Работа с базами данных — маппинг на SQL-типы TIMESTAMP (без часового пояса) через JPA/Hibernate.
  • Формирование отчётов — группировка данных по датам и времени.

Сравнение с альтернативами

КлассЧасовой поясНазначение
LocalDateTimeНетДата + время без зоны
ZonedDateTimeДа (полная информация о зоне)Дата + время с учётом зоны и летнего времени
OffsetDateTimeДа (только смещение)Дата + время со смещением от UTC
InstantНет (всегда UTC)Момент времени на временной шкале

Критика и альтернативные подходы

Некоторые разработчики критикуют LocalDateTime за то, что его название может вводить в заблуждение: объект не является «локальным» в смысле часового пояса пользователя, а лишь не содержит информации о зоне. В распределённых системах рекомендуется использовать Instant или ZonedDateTime для однозначной интерпретации времени. Также отмечается, что API класса перегружен методами, что усложняет его изучение новичками.

Интересные факты

  • Класс LocalDateTime был добавлен в Java 8 как часть JSR-310, вдохновлённой библиотекой Joda-Time. Разработчик Joda-Time Стивен Коулборн входил в экспертную группу JSR-310.
  • В отличие от java.util.Date, месяцы в LocalDateTime нумеруются с 1 (январь — 1), что соответствует человеческому восприятию.
  • Максимальное значение наносекунд — 999999999, что даёт точность до 9 знаков после запятой (0.000000001 секунды).
  • Класс поддерживает отрицательные годы (до н.э.), но на практике используется редко.

Источники

  • Java SE 17 Documentation — Class java.time.LocalDateTime (Oracle Corporation, 2023)
  • «Java: The Complete Reference» (Herbert Schildt, 12th edition, 2021)
  • «Modern Java in Action» (Raoul-Gabriel Urma, Mario Fusco, Alan Mycroft, 2018)
  • JSR-310: Date and Time API (Java Community Process, 2014)
  • Joda-Time Project Documentation (Stephen Colebourne, 2007–2023)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →