Библиотека Luxon предоставляет удобный и предсказуемый API для создания объектов даты и времени из отдельных компонентов: года, месяца, дня, часов, минут, секунд и миллисекунд. Такой подход особенно полезен при работе с пользовательскими формами, календарями, расписаниями, временными зонами и серверными данными.
Основным инструментом является метод
DateTime.fromObject().
DateTime.fromObject()Метод создаёт объект DateTime на основе набора
полей.
import { DateTime } from "luxon";
const dt = DateTime.fromObject({
year: 2025,
month: 3,
day: 15
});
console.log(dt.toISO());
Результат:
2025-03-15T00:00:00.000+03:00
Если время не указано, используются значения по умолчанию:
0000const dt = DateTime.fromObject({
year: 2024,
month: 12,
day: 31
});
console.log(dt.toISODate());
Результат:
2024-12-31
const dt = DateTime.fromObject({
year: 2024,
month: 5,
day: 10,
hour: 14,
minute: 45
});
console.log(dt.toFormat("HH:mm"));
Результат:
14:45
const dt = DateTime.fromObject({
year: 2024,
month: 5,
day: 10,
hour: 14,
minute: 45,
second: 12,
millisecond: 500
});
console.log(dt.toISO());
Результат:
2024-05-10T14:45:12.500+03:00
fromObject() поддерживает следующие свойства:
| Поле | Описание |
|---|---|
year |
Год |
month |
Месяц |
day |
День месяца |
hour |
Часы |
minute |
Минуты |
second |
Секунды |
millisecond |
Миллисекунды |
zone |
Временная зона |
locale |
Локаль |
weekday |
День недели |
ordinal |
Порядковый день года |
weekYear |
ISO-неделя: год |
weekNumber |
ISO-неделя: номер недели |
Наиболее распространённый сценарий — формирование полной временной отметки.
const departure = DateTime.fromObject({
year: 2025,
month: 8,
day: 20,
hour: 9,
minute: 30
});
console.log(departure.toString());
По умолчанию используется локальная зона системы. Для создания даты в
определённой зоне используется свойство zone.
const dt = DateTime.fromObject(
{
year: 2025,
month: 1,
day: 1,
hour: 12
},
{
zone: "UTC"
}
);
console.log(dt.toISO());
Результат:
2025-01-01T12:00:00.000Z
const dt = DateTime.fromObject(
{
year: 2025,
month: 7,
day: 1,
hour: 18
},
{
zone: "Europe/Berlin"
}
);
console.log(dt.zoneName);
Результат:
Europe/Berlin
const local = DateTime.fromObject({
year: 2025,
month: 6,
day: 1,
hour: 12
});
const utc = DateTime.fromObject(
{
year: 2025,
month: 6,
day: 1,
hour: 12
},
{
zone: "UTC"
}
);
console.log(local.toISO());
console.log(utc.toISO());
Временные метки будут отличаться смещением.
В Luxon невозможно создать объект без даты — дата всегда присутствует. Однако можно использовать текущий день и задавать только время.
const time = DateTime.fromObject({
hour: 16,
minute: 20
});
console.log(time.toFormat("HH:mm"));
Если не указаны компоненты даты, используются текущие значения.
const dt = DateTime.fromObject({
hour: 8,
minute: 15
});
console.log(dt.toISO());
Такой подход удобен для установки времени будильника, расписаний и таймеров.
Часто значения поступают из HTML-форм.
const formData = {
year: 2025,
month: 9,
day: 14,
hour: 10,
minute: 45
};
const appointment = DateTime.fromObject(formData);
console.log(appointment.toISO());
const year = 2026;
const month = 2;
const day = 18;
const dt = DateTime.fromObject({
year,
month,
day
});
console.log(dt.toISODate());
const currentYear = DateTime.now().year;
const nextYear = DateTime.fromObject({
year: currentYear + 1,
month: 1,
day: 1
});
console.log(nextYear.toISODate());
const dt = DateTime.fromObject({
weekYear: 2025,
weekNumber: 10,
weekday: 1
});
console.log(dt.toISODate());
Здесь:
weekYear — ISO-годweekNumber — номер неделиweekday — день недели (1 —
понедельник)ordinal обозначает порядковый день в году.
const dt = DateTime.fromObject({
year: 2025,
ordinal: 100
});
console.log(dt.toISODate());
Результат:
2025-04-10
const dt = DateTime.fromObject({
year: 2025,
month: 11,
day: 1
});
console.log(dt.toISODate());
const dt = DateTime.fromObject({
year: 2025,
month: 12,
day: 31,
hour: 23,
minute: 59,
second: 59
});
console.log(dt.toISO());
Некорректные значения создают невалидный объект.
const dt = DateTime.fromObject({
year: 2025,
month: 15,
day: 40
});
console.log(dt.isValid);
Результат:
false
console.log(dt.invalidReason);
console.log(dt.invalidExplanation);
Пример результата:
unit out of range
you specified 15 (of type number) as a month, which is invalid
В отличие от стандартного объекта Date, библиотека не
исправляет значения автоматически.
Dateconst date = new Date(2025, 14, 40);
console.log(date);
JavaScript автоматически перенесёт дату на другой месяц.
Luxonconst dt = DateTime.fromObject({
year: 2025,
month: 14,
day: 40
});
console.log(dt.isValid);
Результат:
false
Такое поведение снижает вероятность скрытых ошибок.
Локаль влияет на форматирование и календарные правила.
const dt = DateTime.fromObject(
{
year: 2025,
month: 5,
day: 1
},
{
locale: "ru"
}
);
console.log(dt.locale);
const dt = DateTime.fromObject(
{
year: 2025,
month: 3,
day: 10,
hour: 15
},
{
zone: "Asia/Tokyo",
locale: "ja"
}
);
console.log(dt.toLocaleString(DateTime.DATETIME_FULL));
utc()Для UTC существует более короткий вариант.
const dt = DateTime.utc(
2025,
6,
15,
10,
30
);
console.log(dt.toISO());
Результат:
2025-06-15T10:30:00.000Z
Аргументы передаются в порядке:
fromObject()
и utc()fromObject()DateTime.fromObject({
year: 2025,
month: 5,
day: 10
});
Преимущества:
utc()DateTime.utc(2025, 5, 10);
Преимущества:
const midnight = DateTime.fromObject({
year: 2025,
month: 7,
day: 1,
hour: 0,
minute: 0,
second: 0
});
console.log(midnight.toISO());
const endOfDay = DateTime.fromObject({
year: 2025,
month: 7,
day: 1,
hour: 23,
minute: 59,
second: 59,
millisecond: 999
});
console.log(endOfDay.toISO());
const dates = [];
for (let day = 1; day <= 5; day++) {
dates.push(
DateTime.fromObject({
year: 2025,
month: 1,
day
})
);
}
console.log(dates.map(d => d.toISODate()));
const lessons = [
{ hour: 9, minute: 0 },
{ hour: 11, minute: 30 },
{ hour: 14, minute: 15 }
];
const schedule = lessons.map(item =>
DateTime.fromObject({
year: 2025,
month: 9,
day: 1,
hour: item.hour,
minute: item.minute
})
);
console.log(schedule.map(d => d.toISO()));
const birthday = DateTime.fromObject({
year: 1998,
month: 4,
day: 12
});
const event = DateTime.fromObject({
year: 2025,
month: 10,
day: 5,
hour: 19,
minute: 30
});
const apiDate = DateTime.utc(
2025,
8,
20,
14,
0
);
const sprint = DateTime.fromObject({
weekYear: 2025,
weekNumber: 42,
weekday: 1
});