В 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()Например:
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
Многие серверы возвращают время в миллисекундах:
{
"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);
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-токены обычно содержат секунды.
Пример 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);
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 }));
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());
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
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());
DateDateconst date = new Date(1700000000000);
const dt = DateTime.fromMillis(1700000000000);
Преимущества Luxon:
Методы 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());
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);
/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(), если:Date.now()fromSeconds(), если:| Метод | Назначение |
|---|---|
DateTime.fromMillis() |
Создание из миллисекунд |
DateTime.fromSeconds() |
Создание из секунд |
toMillis() |
Получение миллисекунд |
toSeconds() |
Получение секунд |
Date.now() |
Текущие миллисекунды |
DateTime.now() |
Текущая дата Luxon |