Нумерационная система определяет, какие символы используются для
отображения чисел в форматируемых строках даты и времени. В контексте
JavaScript и международной локализации эта концепция тесно связана со
стандартом Unicode CLDR и API Intl, на котором основана
библиотека Luxon. Вместо привычных арабских цифр 0–9 могут применяться
индийские, арабские-индийские, персидские и другие наборы символов, что
влияет на визуальное представление всех числовых компонентов даты.
В Luxon нумерационная система не является отдельной сущностью внутри
класса DateTime, но задаётся через параметры
форматирования, которые проксируются в Intl.DateTimeFormat.
Ключевым механизмом становится опция numberingSystem,
которая может быть передана через конфигурацию локали или
форматтера.
В основе Luxon лежит использование Intl.DateTimeFormat,
который поддерживает параметр:
numberingSystemОн влияет на отображение всех чисел в результирующей строке: день месяца, год, часы, минуты и секунды.
Пример доступных систем:
latn — латинские цифры (0–9)arab — арабско-индийские цифрыarabext — расширенные арабские цифрыdeva — деванагариthai — тайские цифрыЭта система применяется на уровне локали и может быть частью строки локали вида:
ar-EG-u-nu-arab
где nu указывает на нумерационную систему.
Luxon не реализует собственную систему числовых символов. Вместо
этого он передаёт настройки в Intl, сохраняя поведение
стандартным и предсказуемым.
Ключевой момент: все параметры форматирования даты и времени, включая
нумерационную систему, передаются через toLocaleString,
toFormat (частично) и Intl форматтеры внутри
библиотеки.
В Luxon это проявляется через объект DateTime:
DateTime.toLocaleStringDateTime.toFormatDateTime.toLocaleString(DateTime.DATETIME_MED) и другие
presetsОсновной способ задания нумерационной системы — использование расширенных локалей Unicode.
const dt = DateTime.now().setLocale('ar-EG-u-nu-arab');
dt.toLocaleString(DateTime.DATETIME_FULL);
Результат будет содержать цифры вида:
٢٣ / ٠٥ / ٢٠٢٦
вместо:
23 / 05 / 2026
const dt = DateTime.now().setLocale('th-TH-u-nu-thai');
dt.toLocaleString(DateTime.DATE_FULL);
Числовые компоненты даты будут отображаться с использованием тайских символов:
๒๓ พฤษภาคม ๒๕๖๙
Если нумерационная система не указана:
latnLuxon не выполняет трансформацию цифр самостоятельно, что гарантирует соответствие спецификации ECMAScript Internationalization API.
При использовании Luxon фактически создаётся
Intl.DateTimeFormat примерно следующего вида:
new Intl.DateTimeFormat(locale, {
year: 'numeric',
month: '2-digit',
day: '2-digit',
numberingSystem: 'arab'
});
Luxon автоматически генерирует подобные конфигурации внутри своих preset-форматов.
Несмотря на поддержку через Intl, существуют
ограничения:
numberingSystem через
стандартный API Luxon без использования локалиIntl в окруженииТакже важно учитывать, что toFormat (строковый форматтер
Luxon) не преобразует цифры через numberingSystem — он
опирается на Intl только в тех частях, где это
возможно.
В многоязычных приложениях нумерационная система часто меняется вместе с локалью:
Luxon позволяет переключать поведение через setLocale,
не требуя ручной обработки чисел.
Каждое изменение локали с различной нумерационной системой может
приводить к созданию нового экземпляра Intl.DateTimeFormat.
Внутри Luxon применяется кэширование форматтеров, что снижает накладные
расходы при повторных вызовах с одинаковыми параметрами.
Ключ кэширования включает:
Это позволяет избежать повторной инициализации тяжелых объектов
Intl.
Нумерационная система часто используется совместно с календарями, отличными от григорианского:
Luxon через Intl поддерживает комбинации, где календарь
и нумерация задаются одновременно:
ar-SA-u-ca-islamic-nu-arab
Здесь одновременно определяются:
При форматировании Luxon проходит цепочку:
DateTime хранит внутреннее представление времени в
миллисекундахIntl.DateTimeFormatnumberingSystemЦифры не преобразуются вручную — они генерируются на уровне ICU-библиотеки, встроенной в среду выполнения.
При преобразовании DateTime в JSON через
toISO, toJSON или toString
нумерационная система не применяется, поскольку эти форматы являются
стандартизированными и не зависят от локали. Это разделяет две модели
представления: