Объекты 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 представляет промежутки времени и
требует отдельного подхода к конвертации.
Создание из объекта:
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 представляет временной диапазон между двумя
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
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() теряет информацию о временной зоне
LuxontoISODate() отбрасывает времяtoISOTime() отбрасывает датуDuration.toObject() может округлять дробные
значенияInterval.toDuration() зависит от точности входных
DateTimeПри работе с конвертацией важно учитывать, что Luxon всегда сохраняет исходную семантику времени внутри объекта, но нативные типы JavaScript этого уровня абстракции не поддерживают.