Метод fromJSDate используется для преобразования
стандартного объекта JavaScript Date в объект
DateTime библиотеки Luxon. Он служит мостом между
встроенной датой языка и расширенной моделью работы с датами и временем,
предоставляемой Luxon.
Ключевая особенность заключается в том, что Date в
JavaScript представляет момент времени (timestamp) без встроенной
поддержки временных зон, календарей и локалей, тогда как
DateTime в Luxon добавляет поверх этого уровня строгую
работу с временными зонами, форматами и календарными системами.
DateTime.fromJSDate(jsDate, options)
jsDate
Dateoptions
{
zone,
locale,
numberingSystem,
outputCalendar,
setZone
}
При вызове fromJSDate Luxon:
DateDateTime, привязанный к указанной временной
зоне (или зоне по умолчанию)import { DateTime } from "luxon";
const jsDate = new Date();
const dt = DateTime.fromJSDate(jsDate);
В результате получается объект DateTime, который
соответствует тому же моменту времени, что и исходный
Date.
Одним из ключевых аспектов метода является управление зоной отображения времени.
zoneconst dt = DateTime.fromJSDate(new Date(), {
zone: "Europe/Paris"
});
В этом случае один и тот же момент времени будет представлен в зоне
Europe/Paris, независимо от системной зоны окружения.
setZoneПараметр setZone влияет на то, как интерпретируется
временная зона при создании объекта:
setZone: false (по умолчанию) — используется указанная
зона или системная зона LuxonsetZone: true — сохраняется исходная локальная
интерпретация времениconst dt = DateTime.fromJSDate(new Date(), {
setZone: true
});
Это особенно важно при работе с данными, где важна локальная интерпретация времени, а не только абсолютный timestamp.
Luxon позволяет сразу задавать локаль при преобразовании:
const dt = DateTime.fromJSDate(new Date(), {
locale: "ru"
});
Локаль влияет на:
numberingSystem)Метод также позволяет задать дополнительные параметры отображения:
const dt = DateTime.fromJSDate(new Date(), {
numberingSystem: "latn",
outputCalendar: "gregory"
});
numberingSystem определяет систему цифр (например,
латинская, арабская и др.)outputCalendar задаёт календарную систему
(григорианский, исламский и т.д.)fromJSDate vs
fromISOfromJSDate работает с объектом DatefromISO работает со строкой ISO 8601DateTime.fromJSDate(new Date());
DateTime.fromISO("2026-05-23T10:00:00");
fromJSDate vs
fromObjectfromJSDate принимает готовый момент времениfromObject создаёт дату из компонент (год, месяц, день
и т.д.)DateTime.fromObject({
year: 2026,
month: 5,
day: 23
});
Объект Date хранит время в миллисекундах с начала Unix
эпохи. При преобразовании через fromJSDate:
const jsDate = new Date("2026-05-23T12:34:56.789Z");
const dt = DateTime.fromJSDate(jsDate);
dt.toISO();
// сохраняет миллисекунды
При переходах на летнее/зимнее время поведение зависит от зоны:
const dt = DateTime.fromJSDate(new Date("2026-03-29T01:30:00Z"), {
zone: "Europe/Berlin"
});
Если локальное время попадает в “провал” или “дубликат” при смене DST, Luxon корректно разрешает неоднозначность через правила временной зоны.
DateTime является неизменяемым объектом:
Date остаётся неизменнымconst jsDate = new Date();
const dt1 = DateTime.fromJSDate(jsDate);
const dt2 = dt1.set({ hour: 10 });
dt1 === dt2; // false
Метод часто используется как точка входа в цепочки обработки времени:
const result = DateTime.fromJSDate(new Date())
.setZone("UTC")
.plus({ days: 3 })
.setLocale("ru")
.toFormat("dd LLL yyyy");
Такая модель позволяет:
DateTime.fromJSDate(null); // invalid DateTime
Luxon возвращает объект DateTime, помеченный как
невалидный (isValid = false).
new Date("invalid");
Такой объект также приводит к невалидному DateTime.
DateTime.fromJSDate(new Date(0));
Результат соответствует 1970-01-01T00:00:00Z, с последующей интерпретацией в указанной зоне.
Многие API возвращают даты как ISO-строки, но клиентский код может
оперировать Date. fromJSDate используется для
унификации:
function normalize(date) {
return DateTime.fromJSDate(date).toUTC();
}
Если дата уже была преобразована в Date через
HTML-элементы или библиотеки UI:
const inputDate = new Date(input.value);
const dt = DateTime.fromJSDate(inputDate, {
zone: "system"
});
const eventTime = DateTime.fromJSDate(new Date(), {
zone: "UTC"
}).toISO();
Если не указана зона явно:
DateTime.fromJSDate(new Date());
Это поведение важно учитывать при переносе кода между средами.