Проверка системных возможностей

Библиотека Luxon опирается на встроенные возможности JavaScript-движка и окружения выполнения, прежде всего на объект Intl. Корректность работы с датами, часовыми поясами и локалями напрямую зависит от того, какие системные API доступны и насколько полно реализована спецификация ECMAScript Internationalization API в среде выполнения.

Основной функциональный слой Luxon построен поверх Intl.DateTimeFormat, Intl.RelativeTimeFormat, Intl.NumberFormat. Эти API предоставляют:

  • поддержку локализации дат и времени;
  • работу с IANA часовыми поясами;
  • форматирование календарных значений;
  • корректное отображение временных зон без ручных таблиц смещений.

Критическая зависимость от системных возможностей заключается в том, что Luxon не реализует собственный календарный движок и не содержит встроенной базы временных зон. Вся информация о локали и таймзоне запрашивается у среды выполнения.

Проверка наличия Intl API

Минимальный уровень работоспособности Luxon определяется наличием глобального объекта Intl.

const intlAvailable = typeof Intl !== "undefined";

Отсутствие Intl означает, что большая часть функциональности Luxon будет недоступна: форматирование дат, работа с локалями и часовые пояса либо деградируют, либо становятся некорректными.

Поддержка временных зон

Одним из ключевых факторов является поддержка IANA Time Zone Database через опцию timeZone в Intl.DateTimeFormat.

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

function supportsTimeZone(tz) {
  try {
    new Intl.DateTimeFormat("en-US", { timeZone: tz }).format();
    return true;
  } catch (e) {
    return false;
  }
}

Если среда не поддерживает переданную временную зону, возникает исключение RangeError.

Luxon использует это поведение как индикатор корректности системной поддержки таймзон.

Проверка поддержки IANA зон в целом

Некоторые окружения могут поддерживать Intl, но иметь ограниченную базу временных зон. Для проверки базовой поддержки можно использовать тест с заведомо валидной зоной:

function hasIanaSupport() {
  try {
    const dtf = new Intl.DateTimeFormat(undefined, { timeZone: "UTC" });
    const parts = dtf.formatToParts(new Date());
    return Array.isArray(parts) && parts.length > 0;
  } catch (e) {
    return false;
  }
}

Поддержка formatToParts также является индикатором более полной реализации Intl.

Поведение в Node.js и браузерах

Системные возможности существенно различаются между средами выполнения.

Node.js

В Node.js поддержка Intl зависит от:

  • версии Node.js;
  • флага компиляции ICU (full-icu, small-icu);
  • наличия ICU данных в системе.

Проверка версии ICU:

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);

Если результат отсутствует или возвращается undefined, это сигнал неполной поддержки временных зон.

Также возможно использование:

console.log(process.versions.icu);

Числовая версия ICU позволяет определить уровень международной поддержки.

Браузеры

В современных браузерах Intl почти всегда доступен, однако различия проявляются в:

  • наборе поддерживаемых локалей;
  • корректности обработки исторических переходов часовых зон;
  • поддержке новых форматов календарей.

Проверка локализационных возможностей

Luxon активно использует локаль через Intl.DateTimeFormat.

Проверка доступных локалей:

function isLocaleSupported(locale) {
  return Intl.DateTimeFormat.supportedLocalesOf([locale]).length > 0;
}

Если функция возвращает пустой массив, система не поддерживает указанную локаль напрямую, и будет применена fallback-локаль.

Проверка текущей временной зоны системы

Luxon может работать с системной временной зоной, если она доступна через:

const systemZone = Intl.DateTimeFormat().resolvedOptions().timeZone;

Значение systemZone используется как базовая точка при создании дат без явного указания зоны.

Отсутствие этого значения указывает на ограниченное окружение, где Luxon будет вынужден использовать UTC как дефолт.

Обнаружение деградированных окружений

Некоторые рантаймы предоставляют частичный Intl, что приводит к скрытым ошибкам форматирования.

Типичные признаки:

  • timeZone игнорируется без ошибки;
  • возвращается некорректное смещение;
  • отсутствует поддержка formatToParts.

Простейшая диагностика:

function detectIntlQuality() {
  const dtf = new Intl.DateTimeFormat("en-US", {
    timeZone: "America/New_York",
    hour: "2-digit",
    minute: "2-digit"
  });

  const formatted = dtf.format(new Date());
  return typeof formatted === "string" && formatted.length > 0;
}

Влияние системных возможностей на Luxon DateTime

Luxon DateTime при создании экземпляра опирается на:

  • системную локаль;
  • системную временную зону;
  • поддержку Intl.DateTimeFormat.

Пример:

import { DateTime } from "luxon";

const dt = DateTime.now();

Фактическое значение dt.zoneName определяется через системный Intl.

Если окружение ограничено, возможны сценарии:

  • переход в UTC;
  • отсутствие корректных локальных смещений;
  • упрощённое форматирование.

Проверка поддержки расширенных функций Intl

Некоторые функции Luxon требуют расширенных возможностей Intl:

  • formatToParts
  • resolvedOptions
  • calendar (в некоторых локалях)
  • numberingSystem

Проверка:

function intlCapabilities() {
  const fmt = new Intl.DateTimeFormat();

  return {
    formatToParts: typeof fmt.formatToParts === "function",
    resolvedOptions: typeof fmt.resolvedOptions === "function"
  };
}

Политика fallback-режима

При недостатке системных возможностей Luxon переходит в упрощённые режимы:

  • временные зоны сводятся к UTC;
  • локали заменяются на en;
  • форматирование становится базовым строковым выводом.

Такое поведение не требует дополнительной логики, поскольку встроено в архитектуру Intl-обёрток.

Особенности мобильных и embedded-окружений

Встраиваемые системы и старые мобильные браузеры могут иметь:

  • урезанный ICU;
  • отсутствие IANA базы;
  • частичную локализацию.

Проверка стабильности:

function isStableIntl() {
  try {
    const dtf = new Intl.DateTimeFormat("en", {
      timeZone: "Asia/Tokyo"
    });

    return dtf.format(new Date()).includes("AM") || true;
  } catch {
    return false;
  }
}

Роль системного времени

Luxon опирается на системные часы ОС. Ошибки времени системы напрямую отражаются на результатах:

  • неверные смещения дат;
  • некорректные вычисления интервалов;
  • смещение относительно UTC.

Проверка корректности системного времени:

const now = DateTime.now();
const jsNow = new Date();

const drift = Math.abs(now.toMillis() - jsNow.getTime());

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

Совместимость с Polyfill-решениями

При недостатке системных возможностей возможна подмена Intl через polyfill:

  • full-icu пакет в Node.js;
  • @formatjs/intl-datetimeformat;
  • custom ICU data injection.

После подключения polyfill проверка возможностей повторяется, так как Luxon использует runtime-данные напрямую, без кеширования состояния среды.