Метод fromMillis

Метод DateTime.fromMillis() в библиотеке Luxon используется для создания объекта DateTime на основе количества миллисекунд, прошедших с начала Unix-эпохи (1 января 1970 года, UTC). Это один из базовых способов преобразования числового временного представления в полноценный объект даты с поддержкой часовых поясов, локалей и встроенных методов форматирования.


Общая сигнатура

DateTime.fromMillis(milliseconds, options)

Параметры

milliseconds (number) Целое число, представляющее количество миллисекунд с Unix-эпохи.

  • положительные значения — даты после 01.01.1970
  • отрицательные значения — даты до Unix-эпохи
  • дробные значения обычно округляются вниз до целого

options (object, необязательный) Объект конфигурации, определяющий контекст создания DateTime:

  • zone — часовой пояс (например, "utc", "Europe/London", "Asia/Almaty")
  • locale — локаль (например, "ru", "en")
  • setZone — логическое значение, определяющее, следует ли интерпретировать переданный часовой пояс как активный
  • numberingSystem — система счисления (например, "latn")

Базовое поведение

При вызове fromMillis() Luxon интерпретирует входное значение как абсолютную точку времени.

import { DateTime } from "luxon";

const dt = DateTime.fromMillis(0);
console.log(dt.toISO());

Результат:

1970-01-01T00:00:00.000Z

По умолчанию используется UTC, если не задан другой часовой пояс.


Работа с часовыми поясами

Одно из ключевых преимуществ Luxon — корректная работа с зонами времени.

const dt = DateTime.fromMillis(0, { zone: "Asia/Tokyo" });
console.log(dt.toString());

Здесь момент времени остаётся тем же, но отображение смещается относительно выбранной зоны.

Важно:

  • миллисекунды всегда представляют абсолютное время
  • zone влияет только на интерпретацию и отображение

Параметр setZone

DateTime.fromMillis(0, { zone: "Asia/Tokyo", setZone: true });

Поведение setZone:

  • setZone: false (по умолчанию) — Luxon переводит время в указанную зону
  • setZone: true — сохраняет переданную зону как активную без преобразования отображения

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


Пример преобразования Unix timestamp

const timestamp = 1710000000000;

const dt = DateTime.fromMillis(timestamp, {
  zone: "UTC"
});

console.log(dt.toISO());

Используется в API, базах данных и системах логирования, где время хранится как число.


Связь с другими методами Luxon

fromMillis vs fromSeconds

DateTime.fromMillis(1000);
DateTime.fromSeconds(1);

Оба выражения дают одинаковый результат, но:

  • fromMillis — стандарт для JavaScript
  • fromSeconds — удобен для Unix timestamp в секундах

fromMillis vs fromJSDate

DateTime.fromMillis(Date.now());
DateTime.fromJSDate(new Date());

Разница:

  • fromMillis работает напрямую с числом
  • fromJSDate использует объект Date

Временная точность

JavaScript использует миллисекунды, поэтому:

DateTime.fromMillis(1710000000123);

Luxon сохраняет точность до миллисекунд, что важно для:

  • логирования событий
  • аналитики
  • измерения производительности
  • синхронизации данных

Нормализация значений

Luxon автоматически обрабатывает выходящие за диапазон значения:

DateTime.fromMillis(-1000);

Результат — дата до Unix-эпохи, корректно интерпретируемая системой.


Работа с локалями

const dt = DateTime.fromMillis(Date.now(), {
  locale: "ru"
});

console.log(dt.toLocaleString());

Локаль влияет на:

  • формат дат
  • названия месяцев
  • порядок элементов даты

Форматирование после создания

Объект DateTime можно немедленно преобразовать:

const dt = DateTime.fromMillis(1710000000000);

dt.toISO();          // ISO строка
dt.toLocaleString();  // локализованный формат
dt.toFormat("dd.MM.yyyy HH:mm");

Использование в цепочках преобразований

const result = DateTime
  .fromMillis(1710000000000)
  .setZone("Europe/Berlin")
  .plus({ days: 2 })
  .toFormat("yyyy-MM-dd HH:mm");

Метод fromMillis() часто выступает стартовой точкой цепочки преобразований.


Типичные сценарии применения

1. API и серверные ответы

DateTime.fromMillis(apiResponse.timestamp);

2. Логи событий

DateTime.fromMillis(log.createdAt);

3. Хранение времени в базе данных

DateTime.fromMillis(row.updated_at_ms);

4. Работа с аналитикой

DateTime.fromMillis(event.time);

Ошибки и пограничные случаи

Некорректные значения

DateTime.fromMillis("abc");

Результат: Invalid DateTime


null и undefined

DateTime.fromMillis(null);

Также приводит к невалидному объекту, так как требуется число.


Очень большие значения

При экстремально больших числах возможны:

  • переполнение
  • некорректная интерпретация даты

Производительность

fromMillis() относится к самым быстрым способам создания DateTime, так как:

  • отсутствует парсинг строки
  • нет преобразования Date объекта
  • используется прямое числовое значение

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


Особенности работы с UTC

DateTime.fromMillis(1710000000000, { zone: "utc" });

UTC является базовой системой отсчёта:

  • исключает влияние локального времени
  • используется в распределённых системах
  • обеспечивает детерминированный результат

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

const dt = DateTime.fromMillis(1710000000000);

dt.toMillis();

Метод toMillis() возвращает исходное значение или его эквивалент после преобразований (если изменялась зона — возвращается абсолютное время).


Взаимодействие с Unix временем

const unix = 1710000000;

const dt = DateTime.fromMillis(unix * 1000);

Типичная ошибка — путаница между секундами и миллисекундами.


Поведение при отсутствии options

DateTime.fromMillis(1710000000000);

По умолчанию:

  • зона: локальная или UTC (в зависимости от окружения)
  • локаль: системная
  • numberingSystem: латинская

Роль в архитектуре приложений

Метод fromMillis() часто используется как:

  • точка входа временных данных
  • слой адаптации между API и бизнес-логикой
  • инструмент нормализации времени
  • основа для временных вычислений

Он обеспечивает строгое разделение между:

  • сырыми данными (числа)
  • объектной моделью Luxon
  • форматированием и отображением