Библиотека Luxon опирается на встроенные возможности
JavaScript-движка и окружения выполнения, прежде всего на объект
Intl. Корректность работы с датами, часовыми поясами и
локалями напрямую зависит от того, какие системные API доступны и
насколько полно реализована спецификация ECMAScript Internationalization
API в среде выполнения.
Основной функциональный слой Luxon построен поверх
Intl.DateTimeFormat, Intl.RelativeTimeFormat,
Intl.NumberFormat. Эти API предоставляют:
Критическая зависимость от системных возможностей заключается в том, что Luxon не реализует собственный календарный движок и не содержит встроенной базы временных зон. Вся информация о локали и таймзоне запрашивается у среды выполнения.
Минимальный уровень работоспособности 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 использует это поведение как индикатор корректности системной поддержки таймзон.
Некоторые окружения могут поддерживать 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 поддержка Intl зависит от:
full-icu,
small-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 при создании экземпляра опирается на:
Intl.DateTimeFormat.Пример:
import { DateTime } from "luxon";
const dt = DateTime.now();
Фактическое значение dt.zoneName определяется через
системный Intl.
Если окружение ограничено, возможны сценарии:
Некоторые функции Luxon требуют расширенных возможностей
Intl:
formatToPartsresolvedOptionscalendar (в некоторых локалях)numberingSystemПроверка:
function intlCapabilities() {
const fmt = new Intl.DateTimeFormat();
return {
formatToParts: typeof fmt.formatToParts === "function",
resolvedOptions: typeof fmt.resolvedOptions === "function"
};
}
При недостатке системных возможностей Luxon переходит в упрощённые режимы:
en;Такое поведение не требует дополнительной логики, поскольку встроено
в архитектуру Intl-обёрток.
Встраиваемые системы и старые мобильные браузеры могут иметь:
Проверка стабильности:
function isStableIntl() {
try {
const dtf = new Intl.DateTimeFormat("en", {
timeZone: "Asia/Tokyo"
});
return dtf.format(new Date()).includes("AM") || true;
} catch {
return false;
}
}
Luxon опирается на системные часы ОС. Ошибки времени системы напрямую отражаются на результатах:
Проверка корректности системного времени:
const now = DateTime.now();
const jsNow = new Date();
const drift = Math.abs(now.toMillis() - jsNow.getTime());
Значительное расхождение указывает на проблемы окружения, а не библиотеки.
При недостатке системных возможностей возможна подмена
Intl через polyfill:
@formatjs/intl-datetimeformat;После подключения polyfill проверка возможностей повторяется, так как Luxon использует runtime-данные напрямую, без кеширования состояния среды.