Требования к Intl

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

Luxon использует стандартный объект Intl для выполнения ключевых операций:

  • форматирование дат и времени (Intl.DateTimeFormat)
  • локализация названий месяцев, дней недели и периодов
  • работа с часовыми поясами через timeZone
  • разбор и представление локализованных строк

Критическое требование заключается в наличии следующих возможностей:

  • Intl.DateTimeFormat с поддержкой опции timeZone
  • корректная реализация formatToParts
  • наличие актуальных данных ICU (International Components for Unicode)

Минимальная среда без Intl или с урезанным ICU приводит к деградации функциональности Luxon: форматирование становится ограниченным, а поддержка часовых поясов — неполной.

Поддержка локалей и влияние ICU-данных

Luxon не содержит собственной базы локалей. Все языковые правила делегируются Intl.

new Intl.DateTimeFormat('ru-RU', {
  dateStyle: 'full',
  timeStyle: 'long'
}).format(new Date());

Поведение такого кода полностью определяет движок JavaScript. Luxon лишь оборачивает и стандартизирует использование Intl.

Ключевые зависимости:

  • набор локалей, включённых в ICU
  • уровень полноты данных (full ICU vs small ICU)
  • поддержка расширенных локалей (CLDR)

В средах с ограниченными ICU (например, Node.js с small-icu) часть локалей может отсутствовать, что приводит к fallback на en-US.

Требования к ICU в Node.js

В Node.js Intl зависит от сборки движка V8 и подключённой ICU-библиотеки.

Существуют три основных режима:

1. Full ICU

  • Полный набор локалей
  • Полная поддержка часовых поясов
  • Максимальная совместимость с Luxon

2. Small ICU

  • Ограниченный набор локалей (обычно en-US)
  • Частичная поддержка форматирования
  • Возможные деградации локализации

3. No ICU (редко встречается в современных версиях)

  • Минимальная функциональность Intl
  • Luxon теряет большую часть возможностей форматирования

Luxon требует, чтобы Intl.DateTimeFormat корректно поддерживал:

  • timeZone
  • hourCycle
  • weekday, month, year (для гибких форматов)
  • formatToParts

Без этих возможностей многие методы DateTime.toLocaleString() становятся непредсказуемыми.

Работа с часовыми поясами

Одно из ключевых требований Luxon — наличие полноценной поддержки IANA time zones через Intl.

Пример зависимости:

Intl.DateTimeFormat('en-US', {
  timeZone: 'Europe/Moscow',
  dateStyle: 'long'
}).format(new Date());

Если среда не поддерживает:

  • IANA database
  • параметр timeZone

то Luxon не может корректно выполнять:

  • DateTime.setZone()
  • конвертацию между зонами
  • точное отображение локального времени

В современных браузерах и Node.js (≥ 13+) поддержка обычно присутствует, но поведение зависит от сборки ICU.

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

В браузерных средах Luxon опирается на реализацию Intl в движке:

  • V8 (Chrome, Edge)
  • SpiderMonkey (Firefox)
  • JavaScriptCore (Safari)

Критические различия:

  • Safari исторически имел ограничения в formatToParts
  • некоторые старые версии браузеров не поддерживали все dateStyle/timeStyle
  • поведение timeZone может отличаться в старых сборках

Luxon не выполняет собственную нормализацию этих различий — он полностью делегирует Intl.

Полифиллы и альтернативные реализации

В средах с неполным Intl используются полифиллы:

  • @formatjs/intl-datetimeformat
  • @formatjs/intl-locale
  • intl (устаревший пакет для Node.js)

Полифиллы обычно добавляют:

  • расширенную поддержку локалей
  • недостающие методы форматирования
  • корректную работу formatToParts

Пример подключения:

import '@formatjs/intl-datetimeformat/polyfill';
import '@formatjs/intl-datetimeformat/locale-data/ru';

После подключения Luxon начинает использовать расширенные возможности через глобальный Intl.

Проверка доступных возможностей Intl

Перед использованием Luxon в ограниченных средах часто проверяется наличие критичных возможностей:

const hasTimeZone = (() => {
  try {
    return 'timeZone' in Intl.DateTimeFormat().resolvedOptions();
  } catch {
    return false;
  }
})();

const supportsFormatToParts = (() => {
  try {
    return typeof Intl.DateTimeFormat().formatToParts === 'function';
  } catch {
    return false;
  }
})();

Эти проверки определяют, будет ли Luxon работать в полном режиме или с деградацией функциональности.

Влияние версий ECMAScript

Luxon рассчитан на современные версии стандарта ECMAScript, в которых Intl стабилен и полностью интегрирован:

  • ES2017+ (рекомендуемый минимум)
  • поддержка Temporal-like операций через DateTime API Luxon
  • стабильное поведение Intl.DateTimeFormat

В более старых средах требуется транспиляция и полифиллы, поскольку отсутствуют:

  • formatToParts
  • расширенные options форматирования
  • корректная работа timeZone

Архитектурная роль Intl в Luxon

Intl выполняет роль системного слоя, а Luxon — логического слоя над ним:

  • Intl отвечает за локализацию и форматирование
  • Luxon управляет моделями времени (DateTime, Duration, Interval)
  • ICU-данные определяют качество результата

Таким образом, Luxon не является автономной системой работы с датами, а полностью зависит от корректной и полной реализации Intl в среде выполнения.