Методы LocalDateTime

LocalDateTime — один из центральных классов библиотеки js-joda, предназначенный для хранения даты и времени без часового пояса. Объект объединяет:

  • календарную дату;
  • локальное время;
  • наносекундную точность;
  • неизменяемую структуру данных.

Экземпляр LocalDateTime не содержит информации о временной зоне или смещении UTC. Это делает его удобным для:

  • расписаний;
  • бизнес-логики;
  • локальных временных отметок;
  • хранения времени без привязки к географии.

Пример создания:

const { LocalDateTime } = require('@js-joda/core')

const dateTime = LocalDateTime.of(2025, 3, 15, 14, 30)

console.log(dateTime.toString())
// 2025-03-15T14:30

Создание экземпляров

Метод now()

Возвращает текущие локальные дату и время.

const now = LocalDateTime.now()

console.log(now.toString())

Особенности

  • используются системные часы;
  • время берётся из текущей среды выполнения;
  • результат зависит от локальной временной зоны системы.

Метод of()

Основной способ создания объекта.

Полная сигнатура

LocalDateTime.of(year, month, day, hour, minute)
LocalDateTime.of(year, month, day, hour, minute, second)
LocalDateTime.of(year, month, day, hour, minute, second, nano)

Пример

const dateTime = LocalDateTime.of(
    2025,
    12,
    31,
    23,
    59,
    45,
    500000000
)

console.log(dateTime.toString())
// 2025-12-31T23:59:45.500

Метод parse()

Создаёт объект из строки.

const dt = LocalDateTime.parse('2025-06-10T08:15:30')

console.log(dt.hour())
// 8

Формат строки

Используется ISO-8601:

YYYY-MM-DDTHH:mm:ss

Допускаются:

  • миллисекунды;
  • наносекунды;
  • отсутствие секунд.

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

Метод year()

Возвращает год.

const dt = LocalDateTime.parse('2025-08-14T12:00')

console.log(dt.year())
// 2025

Метод monthValue()

Возвращает номер месяца.

console.log(dt.monthValue())
// 8

Метод month()

Возвращает объект месяца.

console.log(dt.month().toString())
// AUGUST

Метод dayOfMonth()

Получение дня месяца.

console.log(dt.dayOfMonth())
// 14

Метод dayOfWeek()

Возвращает день недели.

console.log(dt.dayOfWeek().toString())
// THURSDAY

Метод dayOfYear()

Номер дня в году.

console.log(dt.dayOfYear())

Методы времени

hour()

console.log(dt.hour())

minute()

console.log(dt.minute())

second()

console.log(dt.second())

nano()

console.log(dt.nano())

Изменение даты и времени

LocalDateTime является immutable-типом.

Это означает:

  • исходный объект не изменяется;
  • каждый метод возвращает новый экземпляр.

Методы with...

Позволяют заменить отдельную часть даты или времени.


withYear()

const updated = dt.withYear(2030)

console.log(updated.toString())

withMonth()

const updated = dt.withMonth(1)

withDayOfMonth()

const updated = dt.withDayOfMonth(1)

withHour()

const updated = dt.withHour(9)

withMinute()

const updated = dt.withMinute(45)

withSecond()

const updated = dt.withSecond(0)

withNano()

const updated = dt.withNano(0)

Добавление и вычитание

Методы plus...

Позволяют добавлять временные значения.


plusYears()

const next = dt.plusYears(2)

plusMonths()

const next = dt.plusMonths(3)

plusWeeks()

const next = dt.plusWeeks(2)

plusDays()

const next = dt.plusDays(10)

plusHours()

const next = dt.plusHours(5)

plusMinutes()

const next = dt.plusMinutes(30)

plusSeconds()

const next = dt.plusSeconds(15)

plusNanos()

const next = dt.plusNanos(1000)

Вычитание

Методы minus...

Работают аналогично plus....


minusYears()

const old = dt.minusYears(1)

minusMonths()

const old = dt.minusMonths(6)

minusDays()

const old = dt.minusDays(20)

minusHours()

const old = dt.minusHours(12)

minusMinutes()

const old = dt.minusMinutes(45)

Сравнение дат и времени

Метод isBefore()

const a = LocalDateTime.parse('2025-01-01T10:00')
const b = LocalDateTime.parse('2025-01-01T12:00')

console.log(a.isBefore(b))
// true

Метод isAfter()

console.log(b.isAfter(a))
// true

Метод isEqual()

console.log(a.isEqual(b))
// false

Метод compareTo()

Возвращает:

  • отрицательное число;
  • ноль;
  • положительное число.
console.log(a.compareTo(b))

Преобразование в строку

Метод toString()

const dt = LocalDateTime.of(2025, 7, 20, 16, 40)

console.log(dt.toString())
// 2025-07-20T16:40

Работа с LocalDate

Метод toLocalDate()

Извлекает только дату.

const date = dt.toLocalDate()

console.log(date.toString())

Работа с LocalTime

Метод toLocalTime()

Извлекает только время.

const time = dt.toLocalTime()

console.log(time.toString())

Объединение даты и времени

Метод atDate()

Добавляет дату к объекту времени.

const { LocalDate, LocalTime } = require('@js-joda/core')

const date = LocalDate.of(2025, 5, 1)
const time = LocalTime.of(14, 30)

const result = time.atDate(date)

console.log(result.toString())

Метод atTime()

Добавляет время к объекту даты.

const result = date.atTime(time)

Работа с временными единицами

Метод plus(amount, unit)

Позволяет использовать универсальные единицы времени.

const { ChronoUnit } = require('@js-joda/core')

const result = dt.plus(5, ChronoUnit.DAYS)

Метод minus(amount, unit)

const result = dt.minus(2, ChronoUnit.HOURS)

Метод until()

Вычисляет разницу между датами.

const start = LocalDateTime.parse('2025-01-01T00:00')
const end = LocalDateTime.parse('2025-01-10T00:00')

const days = start.until(end, ChronoUnit.DAYS)

console.log(days)
// 9

Поддержка Duration

const { Duration } = require('@js-joda/core')

const duration = Duration.ofHours(5)

const result = dt.plus(duration)

Поддержка Period

Period работает только с датой.

const { Period } = require('@js-joda/core')

const period = Period.ofDays(10)

const result = dt.plus(period)

Метод truncatedTo()

Обрезает дату и время до указанной точности.

Обрезка до часов

const result = dt.truncatedTo(ChronoUnit.HOURS)

console.log(result.toString())

Обрезка до минут

const result = dt.truncatedTo(ChronoUnit.MINUTES)

Метод format()

Используется вместе с DateTimeFormatter.

const {
    LocalDateTime,
    DateTimeFormatter
} = require('@js-joda/core')

const dt = LocalDateTime.now()

const formatter = DateTimeFormatter.ofPattern(
    'dd.MM.yyyy HH:mm:ss'
)

console.log(dt.format(formatter))

Пользовательские шаблоны форматирования

Основные токены

Токен Значение
yyyy год
MM месяц
dd день
HH часы
mm минуты
ss секунды
SSS миллисекунды

Пример сложного форматирования

const formatter = DateTimeFormatter.ofPattern(
    'EEEE, dd MMMM yyyy HH:mm:ss'
)

console.log(dt.format(formatter))

Парсинг с форматтером

const formatter = DateTimeFormatter.ofPattern(
    'dd/MM/yyyy HH:mm'
)

const dt = LocalDateTime.parse(
    '25/12/2025 18:30',
    formatter
)

console.log(dt.toString())

Метод with()

Позволяет изменять поле через TemporalField.

const { ChronoField } = require('@js-joda/core')

const result = dt.with(
    ChronoField.HOUR_OF_DAY,
    8
)

Метод get()

Получение значения поля.

const hour = dt.get(ChronoField.HOUR_OF_DAY)

console.log(hour)

Метод range()

Возвращает диапазон допустимых значений.

const range = dt.range(
    ChronoField.DAY_OF_MONTH
)

console.log(range.toString())

Метод query()

Позволяет выполнять пользовательские запросы.

const query = temporal => temporal.dayOfWeek()

const result = dt.query(query)

console.log(result.toString())

Метод adjustInto()

Копирует значения даты и времени в другой temporal-объект.

const adjusted = dt.adjustInto(
    LocalDateTime.now()
)

Проверка високосного года

Метод toLocalDate().isLeapYear()

const leap = dt.toLocalDate().isLeapYear()

console.log(leap)

Получение количества дней в месяце

Метод lengthOfMonth()

const days = dt.toLocalDate().lengthOfMonth()

console.log(days)

Получение количества дней в году

Метод lengthOfYear()

const days = dt.toLocalDate().lengthOfYear()

Работа с наносекундами

js-joda поддерживает наносекундную точность.

const dt = LocalDateTime.of(
    2025,
    1,
    1,
    12,
    0,
    0,
    999999999
)

console.log(dt.nano())

Цепочки вызовов

Благодаря immutable-подходу методы удобно комбинировать.

const result = LocalDateTime.now()
    .plusDays(5)
    .withHour(9)
    .withMinute(0)
    .withSecond(0)
    .truncatedTo(ChronoUnit.MINUTES)

console.log(result.toString())

Типичные сценарии использования

Планирование событий

const meeting = LocalDateTime.now()
    .plusWeeks(1)
    .withHour(10)
    .withMinute(30)

Проверка просрочки

const expired = deadline.isBefore(
    LocalDateTime.now()
)

console.log(expired)

Генерация временных меток

const timestamp = LocalDateTime.now()
    .format(
        DateTimeFormatter.ofPattern(
            'yyyyMMdd_HHmmss'
        )
    )

console.log(timestamp)

Распространённые ошибки

Игнорирование immutable-природы

Неверно:

dt.plusDays(1)

console.log(dt)

Правильно:

dt = dt.plusDays(1)

Использование LocalDateTime для UTC

LocalDateTime не хранит:

  • смещение;
  • часовой пояс;
  • UTC-информацию.

Для UTC используются:

  • ZonedDateTime;
  • OffsetDateTime;
  • Instant.

Некорректный формат строки

Неверно:

LocalDateTime.parse('01-12-2025')

Правильно:

LocalDateTime.parse('2025-12-01T00:00')

Производительность и архитектурные особенности

js-joda основана на принципах Java Time API:

  • неизменяемость объектов;
  • потокобезопасность;
  • строгая типизация временных сущностей;
  • отсутствие скрытых преобразований времени.

Преимущества подхода:

  • предсказуемое поведение;
  • отсутствие ошибок мутации;
  • безопасная работа в многопоточных средах;
  • удобное тестирование;
  • высокая читаемость кода.

Совместное использование с ZonedDateTime

const {
    LocalDateTime,
    ZoneId
} = require('@js-joda/core')

require('@js-joda/timezone')

const dt = LocalDateTime.now()

const zoned = dt.atZone(
    ZoneId.of('Europe/Moscow')
)

console.log(zoned.toString())

Преобразование в Instant

const instant = zoned.toInstant()

console.log(instant.toString())

Использование equals()

const a = LocalDateTime.parse('2025-01-01T10:00')
const b = LocalDateTime.parse('2025-01-01T10:00')

console.log(a.equals(b))
// true

Метод hashCode()

Возвращает числовой хэш объекта.

console.log(dt.hashCode())

Метод toJSON()

Удобен при сериализации.

const json = JSON.stringify({
    createdAt: dt
})

console.log(json)

Работа с ISO-форматами

ISO_LOCAL_DATE_TIME

const formatter =
    DateTimeFormatter.ISO_LOCAL_DATE_TIME

console.log(dt.format(formatter))

Комбинация операций

const result = LocalDateTime
    .parse('2025-05-10T12:00')
    .plusMonths(1)
    .minusDays(3)
    .withHour(8)
    .withMinute(15)
    .withSecond(0)

console.log(result.toString())