Unix-время

Unix-время представляет собой способ измерения времени как количества секунд или миллисекунд, прошедших с момента 1 января 1970 года 00:00:00 UTC (эпоха Unix). В JavaScript эта концепция используется повсеместно, особенно при работе с API, базами данных, логированием и синхронизацией событий. Библиотека Luxon предоставляет удобный и предсказуемый слой абстракции над Unix-временем, устраняя типичные ошибки нативного Date.


Базовая модель Unix-времени в Luxon

В Luxon любой объект DateTime может быть легко приведён к Unix-времени и обратно. Внутренняя модель всегда основана на UTC, даже если объект отображается в локальной временной зоне.

Ключевой принцип:

  • Unix-время не зависит от временной зоны
  • Luxon хранит момент времени как абсолютную точку на временной шкале
  • отображение (zone) влияет только на форматирование, но не на значение epoch

Получение текущего Unix-времени

Текущий момент времени в 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-время исторически существует в двух основных формах:

  • секунды (используется в Unix-системах, API, логах)
  • миллисекунды (используется в JavaScript и браузерах)

Luxon поддерживает оба формата:

now.toMillis();  // 1710000000000
now.toSeconds(); // 1710000000.123

Создание DateTime из Unix-времени

Из миллисекунд

const dt = DateTime.fromMillis(1710000000000);

Из секунд

const dt = DateTime.fromSeconds(1710000000);

Если необходимо восстановить точность:

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

Внутреннее представление timestamp

Luxon хранит Unix-время внутри объекта в поле ts:

const dt = DateTime.now();

dt.ts; // миллисекунды Unix epoch

Важно:

  • ts всегда в миллисекундах
  • это внутреннее представление, но оно стабильно используется в API

UTC и Unix-время

Unix-время всегда привязано к UTC, поэтому:

const dtUTC = DateTime.fromSeconds(1710000000, { zone: "utc" });
const dtLocal = DateTime.fromSeconds(1710000000);

Обе переменные представляют один и тот же момент времени, но отображаются по-разному.

Ключевая идея:

  • Unix timestamp = абсолютная точка времени
  • timezone = способ интерпретации этой точки

Конвертация между зонами и Unix-временем

Переход между временными зонами не изменяет Unix-время:

const dt = DateTime.now().setZone("Europe/Paris");

const unix = dt.toMillis();

const restored = DateTime.fromMillis(unix).setZone("Asia/Tokyo");

Несмотря на смену зоны:

  • unix остаётся неизменным
  • момент времени сохраняется

Частые операции с 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 позволяет сравнивать объекты напрямую через числовую интерпретацию.


Округление Unix-времени

При работе с секундами часто возникает проблема дробных значений:

const seconds = DateTime.now().toSeconds();

Округление:

Math.floor(DateTime.now().toSeconds());
Math.round(DateTime.now().toSeconds());
Math.ceil(DateTime.now().toSeconds());

Преобразование Unix-времени в ISO

Unix timestamp часто требуется преобразовать в ISO 8601:

const dt = DateTime.fromMillis(1710000000000);

const iso = dt.toISO();

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

2024-03-09T12:00:00.000Z

Формирование Unix-времени из объекта DateTime

Любой DateTime может быть приведён к epoch:

const dt = DateTime.local(2024, 5, 10, 12, 0);

const unixMillis = dt.toMillis();
const unixSeconds = dt.toSeconds();

Работа с серверными API

Большинство API используют Unix-время:

Пример отправки запроса

const payload = {
  createdAt: DateTime.now().toSeconds()
};

Приём данных

const dt = DateTime.fromSeconds(apiResponse.createdAt);

Типичные ошибки при работе с Unix-временем

1. Двойное преобразование секунд

Ошибка:

DateTime.fromMillis(seconds); // неправильно

Правильно:

DateTime.fromSeconds(seconds);

2. Умножение уже миллисекундного значения

Ошибка:

DateTime.fromMillis(ms * 1000);

3. Потеря дробной части секунд

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

Это допустимо только если точность до миллисекунд не требуется.


Синхронизация времени между системами

Unix-время используется для синхронизации между:

  • клиентом и сервером
  • микросервисами
  • распределёнными системами логирования

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

const serverTime = DateTime.fromSeconds(serverTimestamp);
const clientTime = DateTime.now();

const offset = clientTime.toMillis() - serverTime.toMillis();

Использование Unix-времени в вычислениях

Тайм-ауты

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

Связь Unix-времени и таймзон

Ключевая концепция:

  • Unix-время всегда UTC
  • Luxon разделяет “момент времени” и “представление”
  • изменение зоны не меняет epoch
const dt = DateTime.fromSeconds(1710000000);

dt.setZone("America/New_York").toMillis() ===
dt.setZone("Asia/Tokyo").toMillis();

Практическая модель использования

В архитектуре приложений Unix-время в Luxon обычно используется как:

  • универсальный идентификатор момента
  • средство хранения в БД
  • формат обмена между сервисами
  • основа для вычислений интервалов

Luxon выступает как слой преобразования между:

  • человекочитаемыми датами
  • системными timestamp
  • форматами API