Преобразование между LocalDate, LocalTime и LocalDateTime

Библиотека js-joda предоставляет строгую модель работы с датой и временем, основанную на API Java Time. Три ключевых типа, используемых для представления календарных данных:

  • LocalDate — только дата;
  • LocalTime — только время;
  • LocalDateTime — дата и время без часового пояса.

Преобразование между этими типами является одной из наиболее распространённых задач при работе с расписаниями, событиями, журналами логирования, системами бронирования и бизнес-логикой.


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

Создание LocalDate

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

const date = LocalDate.of(2025, 3, 15);

console.log(date.toString());

Результат:

2025-03-15

Создание LocalTime

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

const time = LocalTime.of(14, 30, 45);

console.log(time.toString());

Результат:

14:30:45

Создание LocalDateTime

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

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

console.log(dateTime.toString());

Результат:

2025-03-15T14:30

Объединение LocalDate и LocalTime в LocalDateTime

Метод atTime()

Наиболее распространённый способ объединения даты и времени — использование метода atTime().

Пример

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

const date = LocalDate.of(2025, 5, 10);
const time = LocalTime.of(16, 45);

const result = date.atTime(time);

console.log(result.toString());

Результат:

2025-05-10T16:45

Передача времени напрямую

Метод atTime() позволяет передавать часы, минуты и дополнительные компоненты напрямую.

Только часы и минуты

const date = LocalDate.of(2025, 5, 10);

const result = date.atTime(9, 30);

console.log(result.toString());

Результат:

2025-05-10T09:30

Часы, минуты и секунды

const result = date.atTime(9, 30, 15);

console.log(result.toString());

Результат:

2025-05-10T09:30:15

Полное время с наносекундами

const result = date.atTime(9, 30, 15, 500000000);

console.log(result.toString());

Результат:

2025-05-10T09:30:15.500

Получение LocalDate из LocalDateTime

Метод toLocalDate()

Объект LocalDateTime можно разделить на отдельные компоненты.

Пример

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

const dateTime = LocalDateTime.of(
    2025,
    8,
    20,
    18,
    10
);

const date = dateTime.toLocalDate();

console.log(date.toString());

Результат:

2025-08-20

Практическое применение

Извлечение даты используется:

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

Пример группировки логов

const logs = [
    LocalDateTime.parse('2025-05-01T10:15'),
    LocalDateTime.parse('2025-05-01T12:30'),
    LocalDateTime.parse('2025-05-02T09:00')
];

const grouped = {};

for (const log of logs) {
    const date = log.toLocalDate().toString();

    if (!grouped[date]) {
        grouped[date] = [];
    }

    grouped[date].push(log.toString());
}

console.log(grouped);

Получение LocalTime из LocalDateTime

Метод toLocalTime()

Для извлечения времени используется метод toLocalTime().

Пример

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

const dateTime = LocalDateTime.of(
    2025,
    11,
    3,
    21,
    45,
    10
);

const time = dateTime.toLocalTime();

console.log(time.toString());

Результат:

21:45:10

Использование в расписаниях

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

Пример

const meeting = LocalDateTime.parse(
    '2025-11-03T21:45:10'
);

const meetingTime = meeting.toLocalTime();

console.log(`Время встречи: ${meetingTime}`);

Замена даты в LocalDateTime

Метод with()

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

Пример замены даты

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

const original = LocalDateTime.parse(
    '2025-01-10T14:20'
);

const newDate = LocalDate.of(2025, 2, 1);

const updated = original.with(newDate);

console.log(updated.toString());

Результат:

2025-02-01T14:20

Замена времени в LocalDateTime

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

Пример

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

const original = LocalDateTime.parse(
    '2025-01-10T14:20'
);

const newTime = LocalTime.of(9, 0);

const updated = original.with(newTime);

console.log(updated.toString());

Результат:

2025-01-10T09:00

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

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

Строка может содержать одновременно дату и время.

Пример

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

const value = LocalDateTime.parse(
    '2025-06-15T12:45:30'
);

console.log(value.toString());

Разделение после парсинга

const date = value.toLocalDate();
const time = value.toLocalTime();

console.log(date.toString());
console.log(time.toString());

Объединение после отдельного хранения

Во многих базах данных дата и время могут храниться в разных полях.

Пример

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

const dateFromDb = '2025-12-01';
const timeFromDb = '08:15:00';

const date = LocalDate.parse(dateFromDb);
const time = LocalTime.parse(timeFromDb);

const appointment = date.atTime(time);

console.log(appointment.toString());

Работа с полуночью

Метод atStartOfDay()

Для создания LocalDateTime с временем 00:00 используется atStartOfDay().

Пример

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

const date = LocalDate.of(2025, 7, 1);

const start = date.atStartOfDay();

console.log(start.toString());

Результат:

2025-07-01T00:00

Использование в фильтрации

const startOfDay = date.atStartOfDay();
const nextDay = date.plusDays(1).atStartOfDay();

Такой подход особенно полезен при:

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

Сравнение преобразованных объектов

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

const first = LocalDate.parse('2025-01-10');
const second = LocalDate.parse('2025-01-15');

console.log(first.isBefore(second));

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

const morning = LocalTime.parse('09:00');
const evening = LocalTime.parse('18:00');

console.log(morning.isBefore(evening));

Сравнение LocalDateTime

const a = LocalDateTime.parse(
    '2025-01-10T09:00'
);

const b = LocalDateTime.parse(
    '2025-01-10T18:00'
);

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

Частые ошибки при преобразованиях

Потеря времени при извлечении LocalDate

const date = dateTime.toLocalDate();

После такого преобразования информация о времени полностью исчезает.


Потеря даты при извлечении LocalTime

const time = dateTime.toLocalTime();

После преобразования невозможно восстановить исходную дату без дополнительной информации.


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

LocalDate.parse('15-01-2025');

Такой код вызовет ошибку, поскольку стандартный формат:

YYYY-MM-DD

Корректный вариант:

LocalDate.parse('2025-01-15');

Иммутабельность объектов

Все типы в js-joda неизменяемы.

Пример

const date = LocalDate.of(2025, 1, 1);

const changed = date.plusDays(10);

console.log(date.toString());
console.log(changed.toString());

Результат:

2025-01-01
2025-01-11

Исходный объект не изменяется.


Цепочки преобразований

Пример сложного преобразования

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

const date = LocalDate.now();

const result = date
    .plusDays(5)
    .atTime(
        LocalTime.of(10, 30)
    )
    .plusHours(2);

console.log(result.toString());

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

Формирование времени брони

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

const bookingDate = LocalDate.parse(
    '2025-09-10'
);

const bookingTime = LocalTime.parse(
    '19:30'
);

const reservation = bookingDate.atTime(
    bookingTime
);

console.log(reservation.toString());

Проверка времени начала

const openingTime = LocalTime.of(10, 0);

if (
    reservation.toLocalTime()
        .isBefore(openingTime)
) {
    console.log('Ресторан ещё закрыт');
}

Практический пример: журнал событий

Хранение времени события

const eventTime = LocalDateTime.now();

console.log(eventTime.toString());

Получение даты для отчёта

const reportDate = eventTime.toLocalDate();

console.log(reportDate.toString());

Получение времени для отображения

const displayTime = eventTime.toLocalTime();

console.log(displayTime.toString());

Использование статических методов of()

Создание через отдельные компоненты

LocalDate

LocalDate.of(2025, 4, 20);

LocalTime

LocalTime.of(13, 45, 10);

LocalDateTime

LocalDateTime.of(
    2025,
    4,
    20,
    13,
    45,
    10
);

Связь между типами

Структура преобразований

LocalDate + LocalTime
        ↓
   LocalDateTime

LocalDateTime
   ↓        ↓
LocalDate  LocalTime

Когда использовать каждый тип

LocalDate

Подходит для:

  • дней рождения;
  • календарей;
  • праздников;
  • отчётов;
  • дедлайнов без времени.

LocalTime

Используется для:

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

LocalDateTime

Применяется для:

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