ISO стандарты

ISO 8601 и представление даты и времени

Работа с датами в JavaScript исторически связана с внутренним представлением времени в виде количества миллисекунд с начала эпохи Unix (1970-01-01T00:00:00Z). Однако при отображении дат в пользовательских интерфейсах используется международный стандарт ISO 8601, определяющий строгий формат записи даты и времени.

Ключевые особенности ISO 8601:

  • фиксированный порядок компонентов даты: год → месяц → день
  • использование разделителя - для даты и : для времени
  • поддержка временных зон через Z (UTC) или смещение ±HH:mm

Примеры корректных ISO 8601 строк:

  • 2026-05-27
  • 2026-05-27T14:30:00Z
  • 2026-05-27T14:30:00+06:00

В контексте JavaScript Intl API стандарт ISO 8601 является базовым ориентиром для входных и выходных данных, хотя форматирование происходит через локализованные правила.

Класс Intl.DateTimeFormat опирается на стандартизированные календарные и временные представления, обеспечивая преобразование внутренних значений в человеко-читаемые строки.

new Intl.DateTimeFormat('en-US').format(new Date());

Внутри реализации используется согласование с правилами ICU (International Components for Unicode), где ISO 8601 служит фундаментом для унифицированного представления времени.


ISO 4217 и валютные коды

Стандарт ISO 4217 определяет трёхбуквенные коды валют, используемые в международных финансовых системах и широко применяемые в JavaScript Intl API.

Примеры кодов:

  • USD — доллар США
  • EUR — евро
  • KZT — казахстанский тенге
  • JPY — японская иена

В Intl API этот стандарт напрямую используется в Intl.NumberFormat при форматировании денежных значений.

new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD'
}).format(1234.5);

Важные свойства взаимодействия с ISO 4217:

  • строгое соответствие кодов валют международному реестру
  • отделение символа валюты от числового формата
  • возможность регионального отображения (например, 1 234,50 € vs $1,234.50)

Стандарт не только определяет код валюты, но и влияет на правила округления, минимальные единицы и отображение дробных частей.


ISO 3166 и коды стран и регионов

Для локализации форматов используется стандарт ISO 3166, задающий коды стран:

  • двухбуквенный формат (alpha-2): US, DE, KZ
  • трёхбуквенный формат (alpha-3): USA, DEU, KAZ
  • числовой код

В Intl API чаще всего применяется alpha-2 формат в составе BCP 47 локалей:

  • en-US
  • de-DE
  • ru-RU
  • kk-KZ

Эти идентификаторы используются всеми основными форматировщиками:

  • Intl.DateTimeFormat
  • Intl.NumberFormat
  • Intl.Collator
  • Intl.RelativeTimeFormat

Пример:

new Intl.DateTimeFormat('de-DE').format(new Date());

Система локалей представляет собой комбинацию:

  • языка (ISO 639)
  • региона (ISO 3166)
  • скрипта (ISO 15924)

BCP 47 как надстройка над ISO стандартами

Хотя BCP 47 не является ISO стандартом, он объединяет несколько ISO систем в единый формат идентификаторов локалей.

Структура BCP 47:

  • язык (ISO 639): ru, en, de
  • регион (ISO 3166): RU, US, DE
  • скрипт (ISO 15924): Cyrl, Latn

Примеры:

  • ru-Cyrl-RU
  • zh-Hans-CN
  • sr-Latn-RS

Intl API полностью опирается на BCP 47 при выборе локализации.


ICU и реализация стандартов

Intl API реализуется поверх библиотеки ICU (International Components for Unicode), которая агрегирует и применяет международные стандарты, включая ISO.

ICU обеспечивает:

  • соответствие ISO 8601 при форматировании даты
  • поддержку ISO 4217 при работе с валютами
  • корректное отображение локалей BCP 47
  • правила сортировки, зависящие от языка и региона

Вся логика форматирования в JavaScript делегируется ICU, а Intl API выступает как интерфейс доступа.


ISO 8601 в DateTimeFormat и тонкости представления

Несмотря на использование ISO 8601 как базового стандарта, Intl API адаптирует вывод под локаль.

Пример различий:

  • en-US: 05/27/2026
  • de-DE: 27.05.2026
  • ja-JP: 2026/05/27

ISO-формат остаётся внутренней моделью, но внешний вывод регулируется локалями.

Особенности:

  • порядок компонентов может изменяться
  • разделители зависят от региона
  • 12/24-часовой формат выбирается локально
new Intl.DateTimeFormat('en-GB', { timeStyle: 'short' }).format(new Date());

ISO стандарты в числовом форматировании

Intl API использует ISO-подобную модель для чисел через разделение:

  • десятичного разделителя
  • группировки разрядов
  • отрицательных значений

Хотя это не прямое следование ISO 80000, поведение согласуется с международными соглашениями.

Примеры различий:

  • 1,234.56 (en-US)
  • 1.234,56 (de-DE)
  • 1 234,56 (fr-FR)
new Intl.NumberFormat('fr-FR').format(1234.56);

Колляции и языковые стандарты

В сортировке строк используется Intl.Collator, который опирается на правила Unicode и ISO-совместимые языковые коды.

new Intl.Collator('sv-SE').compare('ä', 'z');

Различия сортировки:

  • немецкий язык учитывает умляуты
  • шведский язык трактует ä как отдельную букву
  • английский использует ASCII-порядок

Коллятор учитывает:

  • региональные правила
  • тип чувствительности (регистр, диакритика)
  • языковую специфику

Стандарты времени и временных зон

ISO 8601 определяет формат временных зон, который используется в JavaScript как базовая модель:

  • UTC: Z
  • смещения: +03:00, -05:00

Intl API интерпретирует временные зоны через IANA Time Zone Database, но вывод согласуется с ISO представлением.

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

Связь ISO и Unicode в локализации

Intl API функционирует на пересечении ISO стандартов и Unicode-экосистемы:

  • ISO 639 — язык
  • ISO 3166 — страна
  • ISO 4217 — валюта
  • ISO 8601 — дата и время
  • Unicode CLDR — правила локализации

CLDR (Common Locale Data Repository) дополняет ISO, предоставляя:

  • правила форматирования дат
  • числовые паттерны
  • языковые исключения
  • региональные особенности

Нормализация локалей и канонические формы

Intl API выполняет нормализацию локалей к каноническому виду:

Примеры преобразований:

  • en-usen-US
  • zh-hant-twzh-Hant-TW
  • sr-cyrlsr-Cyrl

Это обеспечивает:

  • совместимость с ICU
  • унификацию ISO/BCP представлений
  • предсказуемость форматирования
Intl.getCanonicalLocales('en-us');

Ограничения и зависимости стандартов

Несмотря на широкое применение ISO стандартов, Intl API имеет ряд ограничений:

  • не все ISO 4217 коды поддерживают исторические валюты
  • ISO 8601 не всегда точно отражает локальные календарные системы
  • региональные исключения могут переопределять базовые правила
  • поддержка зависит от версии ICU в среде выполнения

Эти ограничения компенсируются обновлениями ICU и расширением CLDR.


Календарные системы и ISO совместимость

ISO 8601 ориентирован на григорианский календарь, однако Intl API поддерживает альтернативные системы:

  • японский календарь
  • исламский календарь
  • еврейский календарь
new Intl.DateTimeFormat('ar-SA-u-ca-islamic').format(new Date());

Такая модель сохраняет совместимость с ISO 8601 при внутреннем хранении времени, но расширяет представление за счёт локальных календарных систем.