Компоненты времени

В контексте библиотеки Globalize работа с временем строится вокруг разложения момента времени на отдельные компоненты и последующего их форматирования в соответствии с правилами локали. Под компонентами времени понимаются часы, минуты, секунды, а также вспомогательные элементы отображения, такие как разделители, 12/24-часовой формат и локализованные шаблоны представления.

Globalize не вводит собственную модель времени, а опирается на стандартный объект Date в JavaScript и данные CLDR (Unicode Common Locale Data Repository), где описаны правила отображения времени для разных языков и регионов.


CLDR как основа представления времени

Все операции форматирования времени в Globalize опираются на CLDR:

  • шаблоны времени (timeFormats)
  • локализованные символы (например, двоеточие или точки как разделители)
  • правила 12/24-часового формата
  • особенности отображения ведущих нулей
  • локальные обозначения AM/PM

Пример структуры CLDR для времени:

{
  "timeFormats": {
    "short": "HH:mm",
    "medium": "HH:mm:ss",
    "long": "HH:mm:ss z",
    "full": "HH:mm:ss zzzz"
  }
}

Globalize использует эти шаблоны как основу для построения форматтеров.


Форматирование времени через Globalize

Основной механизм работы с компонентами времени — это форматирование даты через dateFormatter.

const Globalize = require("globalize");

Globalize.load(
  require("cldr-data/supplemental/likelySubtags"),
  require("cldr-data/main/ru/timeZoneNames"),
  require("cldr-data/main/ru/numbers"),
  require("cldr-data/main/ru/ca-gregorian")
);

const globalize = new Globalize("ru");

const timeFormatter = globalize.dateFormatter({ time: "short" });

const date = new Date(2026, 4, 27, 14, 35);

timeFormatter(date); // "14:35"

В этом примере происходит разложение объекта Date на компоненты времени и последующее применение локализованного шаблона.


Компоненты времени и их интерпретация

Часы

Часы в Globalize зависят от выбранного формата:

  • HH — 24-часовой формат с ведущим нулём
  • H — 24-часовой формат без ведущего нуля
  • hh — 12-часовой формат с ведущим нулём
  • h — 12-часовой формат без ведущего нуля

CLDR определяет, какой формат используется по умолчанию для конкретной локали.


Минуты

Минуты обозначаются символом mm или m:

  • mm → всегда два знака (03, 45)
  • m → без ведущего нуля (3, 45)

Globalize применяет локальные правила форматирования, но базовая логика остается одинаковой.


Секунды

Секунды отображаются через:

  • ss — с ведущим нулём
  • s — без ведущего нуля

Секунды чаще используются в форматах типа "medium" и "long".


Скелетоны времени (time skeletons)

В Globalize используется концепция skeleton-форматов, где задаётся не конкретная строка, а набор требований к отображению времени.

const formatter = globalize.dateFormatter({
  skeleton: "Hm"
});

Скелетон "Hm" означает:

  • H — часы (24-часовой формат)
  • m — минуты

Результат зависит от локали:

formatter(new Date(2026, 4, 27, 9, 5)); // "9:05" (или локализованный аналог)

Скелетоны позволяют абстрагироваться от конкретных шаблонов CLDR.


Локализация 12/24-часового формата

Одним из ключевых компонентов времени является выбор системы счисления часов.

CLDR определяет:

  • используется ли 12-часовой формат по умолчанию
  • наличие AM/PM маркеров
  • порядок компонентов

Пример для локали с 12-часовой системой:

const formatter = globalize.dateFormatter({ time: "short" });

formatter(new Date(2026, 4, 27, 22, 15)); // "10:15 PM"

AM/PM формируется на основе CLDR-данных:

  • AM → утренние часы
  • PM → после полудня

Разделители времени

Разделитель между компонентами времени не фиксирован и определяется локалью.

Примеры:

  • : — большинство европейских локалей
  • . — некоторые региональные настройки
  • пробел или другие символы в редких локализациях

Globalize не хардкодит разделители, а извлекает их из CLDR.


Форматы времени: short, medium, long, full

Globalize поддерживает стандартные уровни детализации времени.

short

Минимальное отображение:

globalize.dateFormatter({ time: "short" });

Пример: 14:35


medium

Добавляются секунды:

globalize.dateFormatter({ time: "medium" });

Пример: 14:35:42


long

Добавляется информация о временной зоне:

globalize.dateFormatter({ time: "long" });

Пример: 14:35:42 GMT+3


full

Максимально детализированное представление:

globalize.dateFormatter({ time: "full" });

Пример включает:

  • время
  • временную зону
  • локализованные названия зон

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

Globalize поддерживает обратную операцию — преобразование строки в объект Date.

const parser = globalize.dateParser({ time: "short" });

parser("14:35");

Парсер сопоставляет строку с CLDR-шаблоном и извлекает:

  • часы
  • минуты
  • секунды (если присутствуют)
  • AM/PM (если используется 12-часовой формат)

Влияние локали на интерпретацию времени

Один и тот же ввод может быть интерпретирован по-разному:

  • "02:30" в 24-часовой системе → 02:30 ночи
  • "02:30 PM" → 14:30

Globalize определяет правила интерпретации на основе текущей локали:

const globalize = new Globalize("en");

const parser = globalize.dateParser({ time: "short" });

parser("02:30 PM");

Комбинирование компонентов времени с датой

Хотя время рассматривается как отдельная сущность, оно всегда связано с полной датой.

const formatter = globalize.dateFormatter({
  datetime: "short"
});

formatter(new Date(2026, 4, 27, 18, 10));

Результат объединяет:

  • дату
  • часы
  • минуты

CLDR определяет порядок и разделители между компонентами даты и времени.


Извлечение времени через skeleton с точностью

Скелетоны позволяют управлять детализацией:

globalize.dateFormatter({ skeleton: "Hms" });

Здесь:

  • H — часы
  • m — минуты
  • s — секунды

Результат включает полную точность времени.


Особенности работы с секундной точностью

Секунды могут отображаться с различной точностью:

  • без секунд
  • с целыми секундами
  • с дробными значениями (в зависимости от формата CLDR и настроек)

JavaScript Date хранит миллисекунды, но Globalize обычно округляет их при форматировании.


Нормализация компонентов времени

Перед форматированием Globalize выполняет нормализацию:

  • 0–23 для часов в 24-часовом формате
  • 0–59 для минут
  • 0–59 для секунд

Выход за пределы диапазонов корректируется объектом Date, а не самой библиотекой.


Взаимодействие с временными зонами

Globalize отображает временную зону только при использовании соответствующих форматов CLDR.

Компоненты времени при этом:

  • не конвертируются автоматически
  • отображаются в соответствии с объектом Date
globalize.dateFormatter({ time: "long" });

Зона берётся из системных данных окружения JavaScript.


Роль компонентов времени в интернационализации

Компоненты времени становятся базой для:

  • отображения расписаний
  • локализованных таймеров
  • журналов событий
  • пользовательских интерфейсов с временными метками

Globalize обеспечивает единообразие за счёт строгого следования CLDR, где каждый компонент времени описан как часть общей системы локализации.