Unix-время представляет собой способ измерения времени как количества секунд или миллисекунд, прошедших с момента 1 января 1970 года 00:00:00 UTC (эпоха Unix). В JavaScript эта концепция используется повсеместно, особенно при работе с API, базами данных, логированием и синхронизацией событий. Библиотека Luxon предоставляет удобный и предсказуемый слой абстракции над Unix-временем, устраняя типичные ошибки нативного Date.
В Luxon любой объект DateTime может быть легко приведён
к Unix-времени и обратно. Внутренняя модель всегда основана на UTC, даже
если объект отображается в локальной временной зоне.
Ключевой принцип:
Текущий момент времени в Luxon создаётся через
DateTime.now():
import { DateTime } from "luxon";
const now = DateTime.now();
Преобразование в Unix-время:
const millis = now.toMillis(); // миллисекунды Unix epoch
const seconds = now.toSeconds(); // секунды Unix epoch (float)
Особенности:
toMillis() возвращает целое число в миллисекундахtoSeconds() может возвращать дробное значение (с
точностью до миллисекунд)Unix-время исторически существует в двух основных формах:
Luxon поддерживает оба формата:
now.toMillis(); // 1710000000000
now.toSeconds(); // 1710000000.123
const dt = DateTime.fromMillis(1710000000000);
const dt = DateTime.fromSeconds(1710000000);
Если необходимо восстановить точность:
const dt = DateTime.fromMillis(seconds * 1000);
Luxon хранит Unix-время внутри объекта в поле ts:
const dt = DateTime.now();
dt.ts; // миллисекунды Unix epoch
Важно:
ts всегда в миллисекундахUnix-время всегда привязано к UTC, поэтому:
const dtUTC = DateTime.fromSeconds(1710000000, { zone: "utc" });
const dtLocal = DateTime.fromSeconds(1710000000);
Обе переменные представляют один и тот же момент времени, но отображаются по-разному.
Ключевая идея:
Переход между временными зонами не изменяет Unix-время:
const dt = DateTime.now().setZone("Europe/Paris");
const unix = dt.toMillis();
const restored = DateTime.fromMillis(unix).setZone("Asia/Tokyo");
Несмотря на смену зоны:
unix остаётся неизменнымconst a = DateTime.fromMillis(1710000000000);
const b = DateTime.fromMillis(1710003600000);
const diff = b.toMillis() - a.toMillis();
Результат в миллисекундах.
const a = DateTime.fromSeconds(1710000000);
const b = DateTime.fromSeconds(1710005000);
const isEarlier = a < b;
Luxon позволяет сравнивать объекты напрямую через числовую интерпретацию.
При работе с секундами часто возникает проблема дробных значений:
const seconds = DateTime.now().toSeconds();
Округление:
Math.floor(DateTime.now().toSeconds());
Math.round(DateTime.now().toSeconds());
Math.ceil(DateTime.now().toSeconds());
Unix timestamp часто требуется преобразовать в ISO 8601:
const dt = DateTime.fromMillis(1710000000000);
const iso = dt.toISO();
Пример результата:
2024-03-09T12:00:00.000Z
Любой DateTime может быть приведён к epoch:
const dt = DateTime.local(2024, 5, 10, 12, 0);
const unixMillis = dt.toMillis();
const unixSeconds = dt.toSeconds();
Большинство API используют Unix-время:
const payload = {
createdAt: DateTime.now().toSeconds()
};
const dt = DateTime.fromSeconds(apiResponse.createdAt);
Ошибка:
DateTime.fromMillis(seconds); // неправильно
Правильно:
DateTime.fromSeconds(seconds);
Ошибка:
DateTime.fromMillis(ms * 1000);
const seconds = Math.floor(DateTime.now().toSeconds());
Это допустимо только если точность до миллисекунд не требуется.
Unix-время используется для синхронизации между:
Luxon обеспечивает единый слой преобразований:
const serverTime = DateTime.fromSeconds(serverTimestamp);
const clientTime = DateTime.now();
const offset = clientTime.toMillis() - serverTime.toMillis();
const start = DateTime.now();
const elapsed = DateTime.now().toMillis() - start.toMillis();
const expiresAt = DateTime.fromSeconds(1710005000);
const isExpired = DateTime.now() > expiresAt;
Luxon позволяет приводить любые значения к единому формату epoch:
function normalizeToMillis(input) {
if (typeof input === "number" && input < 1e12) {
return DateTime.fromSeconds(input).toMillis();
}
return DateTime.fromMillis(input).toMillis();
}
Ключевая концепция:
const dt = DateTime.fromSeconds(1710000000);
dt.setZone("America/New_York").toMillis() ===
dt.setZone("Asia/Tokyo").toMillis();
В архитектуре приложений Unix-время в Luxon обычно используется как:
Luxon выступает как слой преобразования между: