LocalDateTime как комбинация даты и времени

LocalDateTime — один из центральных типов библиотеки js-joda, предназначенный для хранения даты и времени без привязки к часовому поясу и смещению UTC. Объект объединяет возможности LocalDate и LocalTime, формируя полноценную локальную временную метку.

Тип используется в задачах:

  • хранение времени событий;
  • работа с расписаниями;
  • бизнес-логика без зависимости от таймзоны;
  • обработка дат в БД;
  • сравнение временных промежутков;
  • вычисления календарных интервалов.

Создание LocalDateTime

Создание через now()

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

const current = LocalDateTime.now();

console.log(current.toString());

Пример результата:

2026-05-24T14:35:12.345

Метод:

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

Создание через of()

Указание даты и времени вручную

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

const dateTime = LocalDateTime.of(
    2026,
    5,
    24,
    14,
    30,
    15
);

console.log(dateTime.toString());

Результат:

2026-05-24T14:30:15

Параметры:

Параметр Значение
year год
month месяц
dayOfMonth день
hour часы
minute минуты
second секунды
nanoOfSecond наносекунды

Создание с наносекундами

const precise = LocalDateTime.of(
    2026,
    5,
    24,
    14,
    30,
    15,
    123456789
);

console.log(precise.toString());

Результат:

2026-05-24T14:30:15.123456789

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


Создание через объединение LocalDate и LocalTime

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

const date = LocalDate.of(2026, 5, 24);
const time = LocalTime.of(18, 45);

const dateTime = LocalDateTime.of(date, time);

console.log(dateTime.toString());

Результат:

2026-05-24T18:45

Подобный подход особенно полезен при независимом хранении даты и времени.


Парсинг строки

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

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

const value = LocalDateTime.parse(
    '2026-05-24T21:15:30'
);

console.log(value);

Строка должна соответствовать формату ISO-8601.


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

Извлечение года

console.log(dateTime.year());

Извлечение месяца

console.log(dateTime.monthValue());

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

console.log(dateTime.dayOfMonth());

Получение часа

console.log(dateTime.hour());

Получение минут

console.log(dateTime.minute());

Получение секунд

console.log(dateTime.second());

Использование Month

console.log(dateTime.month().toString());

Результат:

MAY

Получение дня недели

console.log(dateTime.dayOfWeek().toString());

Результат:

SUNDAY

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

Объекты LocalDateTime неизменяемы. Любая операция создаёт новый экземпляр.


Изменение года

const updated = dateTime.withYear(2030);

console.log(updated);

Изменение месяца

const updated = dateTime.withMonth(12);

Изменение дня

const updated = dateTime.withDayOfMonth(1);

Изменение часов

const updated = dateTime.withHour(9);

Изменение минут

const updated = dateTime.withMinute(0);

Добавление значений

Добавление дней

const future = dateTime.plusDays(10);

Добавление месяцев

const future = dateTime.plusMonths(2);

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

const future = dateTime.plusYears(1);

Добавление часов

const future = dateTime.plusHours(5);

Добавление минут

const future = dateTime.plusMinutes(30);

Добавление секунд

const future = dateTime.plusSeconds(45);

Вычитание значений

Вычитание дней

const past = dateTime.minusDays(7);

Вычитание месяцев

const past = dateTime.minusMonths(1);

Вычитание часов

const past = dateTime.minusHours(2);

Цепочки операций

const result = dateTime
    .plusDays(5)
    .minusHours(3)
    .withMinute(0);

console.log(result);

Иммутабельность позволяет безопасно строить длинные цепочки преобразований.


Сравнение LocalDateTime

Проверка равенства

const a = LocalDateTime.parse('2026-05-24T10:00');
const b = LocalDateTime.parse('2026-05-24T10:00');

console.log(a.equals(b));

Проверка порядка

isBefore()

console.log(a.isBefore(b));

isAfter()

console.log(a.isAfter(b));

Сортировка массива

const list = [
    LocalDateTime.parse('2026-05-24T18:00'),
    LocalDateTime.parse('2026-05-24T09:00'),
    LocalDateTime.parse('2026-05-24T12:00')
];

list.sort((a, b) => a.compareTo(b));

console.log(list);

Работа с Duration

Duration используется для вычисления времени между двумя LocalDateTime.

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

const start = LocalDateTime.parse(
    '2026-05-24T08:00'
);

const end = LocalDateTime.parse(
    '2026-05-24T12:30'
);

const duration = Duration.between(start, end);

console.log(duration.toHours());

Результат:

4

Получение минут между датами

console.log(duration.toMinutes());

Работа с Period

Period вычисляет календарную разницу.

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

const start = LocalDate.of(2025, 1, 1);
const end = LocalDate.of(2026, 5, 24);

const period = Period.between(start, end);

console.log(period.years());
console.log(period.months());
console.log(period.days());

Period ориентирован на календарные значения, а не на абсолютное время.


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

const date = dateTime.toLocalDate();

console.log(date);

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

const time = dateTime.toLocalTime();

console.log(time);

Использование TemporalAdjusters

Модуль @js-joda/core поддерживает корректировку дат.

Следующий понедельник

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

const value = LocalDateTime.now()
    .with(
        TemporalAdjusters.next(DayOfWeek.MONDAY)
    );

console.log(value);

Начало дня

const startOfDay = dateTime
    .withHour(0)
    .withMinute(0)
    .withSecond(0)
    .withNano(0);

Конец дня

const endOfDay = dateTime
    .withHour(23)
    .withMinute(59)
    .withSecond(59)
    .withNano(999999999);

Форматирование даты и времени

Использование DateTimeFormatter

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

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

const value = LocalDateTime.now();

console.log(value.format(formatter));

Результат:

24.05.2026 18:45:10

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

Шаблон Описание
yyyy год
MM месяц
dd день
HH часы
mm минуты
ss секунды

ISO-форматы

console.log(
    dateTime.format(
        DateTimeFormatter.ISO_LOCAL_DATE_TIME
    )
);

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

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

const parsed = LocalDateTime.parse(
    '24.05.2026 14:30',
    formatter
);

console.log(parsed);

Работа с ChronoUnit

ChronoUnit позволяет измерять разницу между временными точками.

Количество дней

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

const days = ChronoUnit.DAYS.between(
    start,
    end
);

console.log(days);

Количество часов

const hours = ChronoUnit.HOURS.between(
    start,
    end
);

console.log(hours);

Использование LocalDateTime в бизнес-логике

Проверка рабочего времени

function isWorkingHours(dateTime) {
    const hour = dateTime.hour();

    return hour >= 9 && hour < 18;
}

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

function isExpired(expirationDate) {
    return expirationDate.isBefore(
        LocalDateTime.now()
    );
}

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

const meeting = LocalDateTime.now()
    .plusDays(3)
    .withHour(11)
    .withMinute(30)
    .withSecond(0);

console.log(meeting);

Генерация временных диапазонов

const start = LocalDateTime.parse(
    '2026-05-24T09:00'
);

const end = LocalDateTime.parse(
    '2026-05-24T12:00'
);

let current = start;

while (current.isBefore(end)) {
    console.log(current);

    current = current.plusMinutes(30);
}

Работа с базами данных

LocalDateTime часто используется для хранения:

  • даты создания записи;
  • времени обновления;
  • времени публикации;
  • расписаний;
  • логов событий.

Пример структуры:

const post = {
    title: 'Новая статья',
    createdAt: LocalDateTime.now(),
    updatedAt: LocalDateTime.now()
};

Отличие LocalDateTime от Date

LocalDateTime Date
Не зависит от таймзоны Использует UTC
Иммутабелен Изменяем
Наносекунды Миллисекунды
Предсказуемая арифметика Возможны побочные эффекты
ISO API Устаревший API

Ограничения LocalDateTime

Тип не содержит:

  • часовой пояс;
  • UTC offset;
  • информацию о DST;
  • географическую зону.

Для работы с часовыми поясами используются:

  • ZonedDateTime;
  • OffsetDateTime;
  • ZoneId.

Типичные ошибки

Путаница с часовыми поясами

LocalDateTime не предназначен для хранения глобального времени.

Неправильно:

const utcTime = LocalDateTime.now();

Правильно использовать ZonedDateTime или Instant, если требуется абсолютное время.


Попытка изменения объекта

Неправильно:

dateTime.plusDays(1);

console.log(dateTime);

Объект останется неизменным.

Правильно:

dateTime = dateTime.plusDays(1);

Использование невалидных значений

LocalDateTime.of(
    2026,
    15,
    50,
    99,
    99
);

Будет выброшено исключение.


Производительность и неизменяемость

Иммутабельность обеспечивает:

  • потокобезопасность;
  • отсутствие скрытых изменений;
  • предсказуемость поведения;
  • безопасную передачу объектов между функциями.

Каждая операция создаёт новый объект:

const original = LocalDateTime.now();

const modified = original.plusDays(1);

console.log(original);
console.log(modified);

Практический пример: система бронирования

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

const bookingStart = LocalDateTime.parse(
    '2026-05-24T14:00'
);

const bookingEnd = bookingStart.plusHours(2);

const duration = Duration.between(
    bookingStart,
    bookingEnd
);

console.log(bookingStart);
console.log(bookingEnd);
console.log(duration.toMinutes());

Практический пример: дедлайн задачи

const createdAt = LocalDateTime.now();

const deadline = createdAt
    .plusDays(7)
    .withHour(23)
    .withMinute(59);

console.log(deadline);

Практический пример: фильтрация событий

const now = LocalDateTime.now();

const events = [
    LocalDateTime.parse('2026-05-24T10:00'),
    LocalDateTime.parse('2026-05-25T12:00'),
    LocalDateTime.parse('2026-05-20T09:00')
];

const futureEvents = events.filter(
    event => event.isAfter(now)
);

console.log(futureEvents);