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

Объекты DateTime в Luxon предназначены для работы с датой и временем в расширенном виде, однако во многих сценариях требуется преобразование в нативные типы JavaScript или строковые представления для передачи данных, сериализации или взаимодействия с API.

Наиболее прямое преобразование — получение объекта Date стандартного Jav * aScript:

import { DateTime } from "luxon";

const dt = DateTime.now();
const jsDate = dt.toJSDate();

Метод toJSDate() возвращает экземпляр Date, соответствующий моменту времени, представленному в DateTime. Это важно при интеграции с библиотеками, ожидающими нативные объекты, например, с API браузера или сторонними SDK.

Альтернативный путь — получение числового представления времени:

const millis = dt.toMillis();

toMillis() возвращает количество миллисекунд, прошедших с Unix-эпохи (1970-01-01T00:00:00Z). Это значение используется для хранения, сравнения и математических операций.

Эквивалентный доступ возможен через:

const millisAlt = dt.valueOf();

В Luxon valueOf() также возвращает timestamp в миллисекундах, что позволяет использовать DateTime в арифметических выражениях:

const diff = DateTime.now() - DateTime.now().minus({ days: 1 });

Преобразование из нативных типов

Luxon поддерживает создание DateTime из различных источников, включая стандартные JavaScript-объекты и числовые значения.

Из объекта Date:

const jsDate = new Date();
const dt = DateTime.fromJSDate(jsDate);

При этом сохраняется локальная временная зона по умолчанию, если явно не указана иная.

Из миллисекунд:

const dt = DateTime.fromMillis(1710000000000);

Из секунд:

const dt = DateTime.fromSeconds(1710000000);

Часто применяется создание из ISO-строки:

const dt = DateTime.fromISO("2026-05-23T10:30:00.000Z");

Этот формат является базовым стандартом обмена датами и используется в большинстве API.

Строковые представления

Luxon предоставляет несколько уровней преобразования DateTime в строку.

ISO-представление:

const iso = dt.toISO();

Метод toISO() возвращает полную дату и время в стандарте ISO 8601, включая временную зону.

Для более узких случаев:

dt.toISODate(); // только дата
dt.toISOTime(); // только время

Форматирование с пользовательским шаблоном:

dt.toFormat("yyyy LLL dd, HH:mm");

Метод toFormat() опирается на токены Luxon и позволяет формировать строки любой сложности, включая локализованные представления.

Числовые представления и арифметика времени

В Luxon дата может быть представлена как числовая величина, что важно для вычислений.

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

dt.toMillis();   // миллисекунды
dt.toSeconds();  // секунды (через Math.floor(dt.toMillis() / 1000))

Для явного получения секунд используется:

Math.floor(dt.toMillis() / 1000);

Также допустимо использование valueOf():

const timestamp = +dt; // неявное приведение

Это делает DateTime совместимым с операциями сравнения:

dt1 > dt2

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

Объект Duration представляет промежутки времени и требует отдельного подхода к конвертации.

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

import { Duration } from "luxon";

const dur = Duration.fromObject({ hours: 2, minutes: 30 });

Преобразование в миллисекунды:

const ms = dur.toMillis();

Преобразование в конкретные единицы:

dur.as("hours");
dur.as("minutes");
dur.as("seconds");

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

Также доступно структурное представление:

dur.toObject();

Результат:

{ hours: 2, minutes: 30 }

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

Interval представляет временной диапазон между двумя DateTime.

Создание:

import { Interval } from "luxon";

const start = DateTime.now();
const end = start.plus({ hours: 5 });

const interval = Interval.fromDateTimes(start, end);

Получение длительности:

const duration = interval.toDuration();

После преобразования можно применять стандартные методы Duration:

duration.as("hours");

Также доступно строковое представление:

interval.toISO();

Формат ISO интервала:

start/end

Пример:

2026-05-23T10:00:00.000Z/2026-05-23T15:00:00.000Z

JSON-сериализация

Luxon переопределяет поведение сериализации через toJSON().

Для DateTime:

const json = JSON.stringify(dt);

Результат эквивалентен:

dt.toISO();

Таким образом, при передаче через API или сохранении в JSON автоматически используется ISO-формат.

Для Duration:

JSON.stringify(dur);

Результат:

{ "values": { "hours": 2, "minutes": 30 }, "locale": "en" }

Для Interval:

JSON.stringify(interval);

Формат аналогичен ISO-представлению интервала.

Преобразование между временными зонами перед сериализацией

Перед конвертацией часто требуется нормализация зоны:

const utc = dt.toUTC();
const local = dt.toLocal();

После этого любые преобразования (toISO, toMillis, toJSDate) фиксируют уже скорректированное время, что критично при хранении данных в UTC.

Особенности потерь данных при конвертации

Преобразования между типами могут приводить к потере части информации:

  • toJSDate() теряет информацию о временной зоне Luxon
  • toISODate() отбрасывает время
  • toISOTime() отбрасывает дату
  • Duration.toObject() может округлять дробные значения
  • Interval.toDuration() зависит от точности входных DateTime

При работе с конвертацией важно учитывать, что Luxon всегда сохраняет исходную семантику времени внутри объекта, но нативные типы JavaScript этого уровня абстракции не поддерживают.