Создание из компонентов

Библиотека 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

Если время не указано, используются значения по умолчанию:

  • часы — 0
  • минуты — 0
  • секунды — 0
  • миллисекунды — 0

Основные компоненты даты

Год, месяц и день

const 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

Отличие локального времени от UTC

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());

ISO-недели

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

const dt = DateTime.fromObject({
  weekYear: 2025,
  weekNumber: 10,
  weekday: 1
});

console.log(dt.toISODate());

Здесь:

  • weekYear — ISO-год
  • weekNumber — номер недели
  • weekday — день недели (1 — понедельник)

Использование ordinal

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, библиотека не исправляет значения автоматически.

Поведение стандартного Date

const date = new Date(2025, 14, 40);

console.log(date);

JavaScript автоматически перенесёт дату на другой месяц.

Поведение Luxon

const dt = DateTime.fromObject({
  year: 2025,
  month: 14,
  day: 40
});

console.log(dt.isValid);

Результат:

false

Такое поведение снижает вероятность скрытых ошибок.


Использование locale

Локаль влияет на форматирование и календарные правила.

const dt = DateTime.fromObject(
  {
    year: 2025,
    month: 5,
    day: 1
  },
  {
    locale: "ru"
  }
);

console.log(dt.locale);

Комбинирование zone и 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()

Для UTC существует более короткий вариант.

const dt = DateTime.utc(
  2025,
  6,
  15,
  10,
  30
);

console.log(dt.toISO());

Результат:

2025-06-15T10:30:00.000Z

Аргументы передаются в порядке:

  1. год
  2. месяц
  3. день
  4. часы
  5. минуты
  6. секунды
  7. миллисекунды

Сравнение fromObject() и utc()

fromObject()

DateTime.fromObject({
  year: 2025,
  month: 5,
  day: 10
});

Преимущества:

  • читаемость
  • именованные поля
  • удобно передавать объект
  • проще работать с формами

utc()

DateTime.utc(2025, 5, 10);

Преимущества:

  • компактность
  • меньше кода
  • удобно для UTC-данных

Создание полуночи

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
});

Дата в UTC

const apiDate = DateTime.utc(
  2025,
  8,
  20,
  14,
  0
);

Дата по ISO-неделе

const sprint = DateTime.fromObject({
  weekYear: 2025,
  weekNumber: 42,
  weekday: 1
});