Создание из миллисекунд и секунд

В Luxon большинство операций строится вокруг класса DateTime. Помимо строк, объектов Date и ISO-форматов, экземпляры DateTime могут создаваться напрямую из числовых временных меток — миллисекунд и секунд Unix Epoch.

Unix Epoch — это точка отсчёта времени:

1970-01-01T00:00:00.000Z

Все временные значения представляют собой количество времени, прошедшего с этой даты.


Метод DateTime.fromMillis()

Метод fromMillis() создаёт объект DateTime из количества миллисекунд.

Синтаксис

DateTime.fromMillis(milliseconds, options)

Параметры

Параметр Описание
milliseconds Количество миллисекунд с Unix Epoch
options Дополнительные настройки зоны и локали

Базовое создание из миллисекунд

import { DateTime } from "luxon";

const dt = DateTime.fromMillis(1700000000000);

console.log(dt.toISO());

Результат:

2023-11-14T22:13:20.000+00:00

Что представляют собой миллисекунды

В Javascript миллисекунды используются практически повсеместно:

  • Date.now()
  • таймеры
  • базы данных
  • timestamp-поля API
  • логи
  • системное время

Например:

const timestamp = Date.now();

console.log(timestamp);

Возможный результат:

1717000000000

Этот timestamp можно напрямую передать в Luxon:

const dt = DateTime.fromMillis(Date.now());

console.log(dt.toFormat("dd.MM.yyyy HH:mm:ss"));

Создание времени в определённой зоне

По умолчанию Luxon использует локальную временную зону системы.

Зона может быть указана явно:

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

console.log(dt.toISO());

Использование других временных зон

const dt = DateTime.fromMillis(
  1700000000000,
  { zone: "Asia/Almaty" }
);

console.log(dt.toString());

Пример результата:

2023-11-15T04:13:20.000+06:00

Преобразование timestamp из API

Многие серверы возвращают время в миллисекундах:

{
  "createdAt": 1717000000000
}

Преобразование:

const response = {
  createdAt: 1717000000000
};

const created = DateTime.fromMillis(response.createdAt);

console.log(created.toRelative());

Работа с отрицательными значениями

Timestamp может быть отрицательным. Это означает дату до 1970 года.

const dt = DateTime.fromMillis(-1000000000);

console.log(dt.toISO());

Результат:

1969-12-20T10:13:20.000+00:00

Метод DateTime.fromSeconds()

Luxon поддерживает создание даты из секунд через fromSeconds().

Синтаксис

DateTime.fromSeconds(seconds, options)

Создание объекта из секунд

const dt = DateTime.fromSeconds(1700000000);

console.log(dt.toISO());

Результат:

2023-11-14T22:13:20.000+00:00

Разница между миллисекундами и секундами

Это одна из самых частых ошибок при работе с датами.

Миллисекунды

1700000000000

Секунды

1700000000

Разница составляет:

1000 раз

Типичная ошибка

Неверное использование:

DateTime.fromMillis(1700000000);

Результат:

1970-01-20T16:13:20.000+00:00

Причина — значение было в секундах, а не в миллисекундах.

Правильный вариант:

DateTime.fromSeconds(1700000000);

Конвертация секунд в миллисекунды

Иногда API возвращает секунды, а код ожидает миллисекунды.

const seconds = 1700000000;

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

console.log(dt.toISO());

Конвертация миллисекунд в секунды

const millis = Date.now();

const seconds = Math.floor(millis / 1000);

console.log(seconds);

Получение timestamp обратно

Luxon умеет преобразовывать DateTime обратно в числовые значения.

Миллисекунды

const dt = DateTime.now();

console.log(dt.toMillis());

Секунды

console.log(dt.toSeconds());

Отличие toMillis() и toSeconds()

toMillis()

Возвращает целое число:

1717000000000

toSeconds()

Может возвращать дробное значение:

1717000000.123

Округление секунд

Для целых Unix timestamp обычно используется округление:

const unix = Math.floor(DateTime.now().toSeconds());

console.log(unix);

Использование с базами данных

Разные СУБД используют разные форматы времени.

Система Формат
PostgreSQL timestamp
MongoDB миллисекунды
Redis секунды
Unix-системы секунды
Javascript миллисекунды

Работа с JWT и Unix timestamp

JWT-токены обычно содержат секунды.

Пример payload:

{
  "exp": 1717000000
}

Преобразование:

const expiration = DateTime.fromSeconds(1717000000);

console.log(expiration.toISO());

Проверка истечения времени

const expiration = DateTime.fromSeconds(1717000000);

const isExpired = expiration < DateTime.now();

console.log(isExpired);

Создание даты из текущего timestamp

const nowMillis = Date.now();

const now = DateTime.fromMillis(nowMillis);

console.log(now.toISO());

Эквивалент Date.now()

Luxon предоставляет собственный способ:

const now = DateTime.now();

console.log(now.toMillis());

Работа с высокоточным временем

fromMillis() поддерживает дробные значения.

const dt = DateTime.fromMillis(1700000000000.456);

console.log(dt.toISO({ includeOffset: true }));

Timestamp и UTC

Unix timestamp всегда основан на UTC.

Это означает:

DateTime.fromMillis(0, { zone: "UTC" })

и

DateTime.fromSeconds(0, { zone: "UTC" })

соответствуют:

1970-01-01T00:00:00.000Z

Отображение в локальном времени

Хотя timestamp хранится относительно UTC, отображение зависит от зоны.

const dt = DateTime.fromSeconds(0);

console.log(dt.toString());

В разных странах результат будет различаться.


Использование setZone()

const dt = DateTime
  .fromSeconds(1700000000)
  .setZone("Europe/Berlin");

console.log(dt.toISO());

Создание через UTC

const dt = DateTime.fromMillis(
  1700000000000,
  { zone: "utc" }
);

console.log(dt.toUTC().toISO());

Проверка валидности

Если передано некорректное значение:

const dt = DateTime.fromMillis("abc");

console.log(dt.isValid);

Результат:

false

Причина ошибки

console.log(dt.invalidReason);

Возможный результат:

invalid input

Работа с большими timestamp

const future = DateTime.fromMillis(9999999999999);

console.log(future.toISO());

Создание времени прошлого

const past = DateTime.fromSeconds(1000000);

console.log(past.toISO());

Преобразование объекта Date

Стандартный Date хранит время в миллисекундах.

const jsDate = new Date();

const dt = DateTime.fromMillis(jsDate.getTime());

console.log(dt.toISO());

Сравнение с нативным Date

Javascript Date

const date = new Date(1700000000000);

Luxon

const dt = DateTime.fromMillis(1700000000000);

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

  • встроенные временные зоны
  • удобное форматирование
  • immutable-объекты
  • поддержка локалей
  • расширенные вычисления времени

Immutable-поведение

Методы Luxon не изменяют исходный объект.

const original = DateTime.fromSeconds(1700000000);

const changed = original.plus({ days: 1 });

console.log(original.toISO());
console.log(changed.toISO());

Практический пример логирования

function logEvent(message) {
  const timestamp = Date.now();

  const dt = DateTime.fromMillis(timestamp);

  console.log(
    `[${dt.toFormat("HH:mm:ss")}] ${message}`
  );
}

logEvent("Server started");

Практический пример времени жизни кеша

const created = DateTime.now();

const expires = created.plus({ minutes: 30 });

console.log(expires.toSeconds());

Практический пример сравнения timestamp

const a = DateTime.fromMillis(1700000000000);
const b = DateTime.fromMillis(1710000000000);

console.log(a < b);

Получение возраста записи

const createdAt = DateTime.fromMillis(1700000000000);

const diff = DateTime.now().diff(createdAt, "days");

console.log(diff.days);

Использование Unix timestamp в URL

/api/posts?since=1717000000

Обработка:

const since = 1717000000;

const dt = DateTime.fromSeconds(since);

console.log(dt.toISO());

Наиболее распространённые ошибки

Передача секунд вместо миллисекунд

DateTime.fromMillis(1700000000);

Передача миллисекунд вместо секунд

DateTime.fromSeconds(1700000000000);

Игнорирование временной зоны

DateTime.fromMillis(timestamp);

Без явной зоны результат зависит от окружения.


Рекомендации по использованию

Использовать fromMillis(), если:

  • данные приходят из Javascript
  • используется Date.now()
  • timestamp хранится в MongoDB
  • работа ведётся внутри браузера

Использовать fromSeconds(), если:

  • данные приходят из Unix-систем
  • используется JWT
  • timestamp получен из Linux CLI
  • API работает с Unix time

Краткая сводка методов

Метод Назначение
DateTime.fromMillis() Создание из миллисекунд
DateTime.fromSeconds() Создание из секунд
toMillis() Получение миллисекунд
toSeconds() Получение секунд
Date.now() Текущие миллисекунды
DateTime.now() Текущая дата Luxon