Компоненты даты

Работа с датами в Globalize строится поверх данных CLDR (Unicode Common Locale Data Repository), где каждая локаль описывает правила отображения календарных элементов: порядок полей, названия месяцев, сокращения, правила форматирования времени и особенности календарных систем. Компоненты даты в Globalize представляют собой логические части даты и времени, которые используются при форматировании, разборе и структурировании временных значений.

Базовые компоненты календарной даты

Любая дата в контексте Globalize раскладывается на набор фундаментальных компонентов:

Год (year) Числовое значение календарного года. Может форматироваться в виде:

  • полного года (2026)
  • двухзначного представления (26)

Год является основой большинства календарных шаблонов и участвует в построении как коротких, так и полных форматов дат.

Месяц (month) Месяц представлен как:

  • числовое значение (1–12 или 01–12 в зависимости от локали)
  • текстовое название (январь, февраль и т.д.)
  • сокращённая форма (янв., февр. и т.д.)

Globalize использует CLDR-данные для выбора корректного отображения месяца в зависимости от локали и контекста.

День (day) День месяца — числовой компонент, обычно отображается с ведущим нулём или без него. Форматирование зависит от шаблона и локали.


Временные компоненты

Помимо календарной части, дата включает временные компоненты, определяющие точное время суток.

Час (hour) Поддерживаются два формата:

  • 24-часовой (0–23)
  • 12-часовой (1–12 с AM/PM)

Globalize автоматически выбирает формат в зависимости от локали и заданного skeleton.

Минута (minute) Минуты отображаются как числовой компонент от 00 до 59. Этот элемент всегда зависит от часа и не имеет самостоятельной локализационной сложности, кроме форматирования.

Секунда (second) Секунды варьируются от 00 до 59 и используются в более точных временных представлениях. В некоторых форматах могут включаться доли секунды.

Миллисекунды (fractional seconds) Часто применяются в технических форматах времени. Поддержка зависит от выбранного шаблона форматирования.


Контекстные компоненты даты

Некоторые элементы даты не являются строго числовыми, но критически важны для локализации.

День недели (weekday) Представляется как:

  • полное название (понедельник)
  • сокращение (пн)

Значение определяется по дате и календарной системе, учитывая локаль.

Эра (era) Используется в календарных системах, где важна историческая привязка:

  • до нашей эры
  • наша эра

В разных локалях обозначения могут существенно отличаться.

Квартал (quarter) Используется в деловой и финансовой отчетности:

  • Q1, Q2, Q3, Q4
  • либо локализованные текстовые формы

Формирование компонентов через skeleton

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

Skeleton определяет набор полей, например:

  • y — год
  • M — месяц
  • d — день
  • H — 24-часовой формат
  • h — 12-часовой формат
  • m — минуты
  • s — секунды

Скелетон yMd означает, что дата должна включать год, месяц и день, но конкретный формат зависит от локали.

Пример использования:

Globalize.formatDate(new Date(2026, 0, 15), { skeleton: "yMd" });

Результат будет различаться в зависимости от локали:

  • en: 1/15/2026
  • ru: 15.01.2026

Skeleton позволяет отделить смысл даты от её представления.


Разбиение даты на компоненты

Одной из ключевых возможностей Globalize является получение структуры даты в виде набора частей. Это важно для интерфейсов, где требуется гибкое форматирование или кастомная разметка.

Метод formatDateToParts возвращает массив объектов, где каждый элемент представляет отдельный компонент даты.

Каждый элемент имеет структуру:

  • type — тип компонента (year, month, day, literal и т.д.)
  • value — строковое значение

Пример:

Globalize.formatDateToParts(new Date(2026, 0, 15), {
  skeleton: "yMd"
});

Результат может выглядеть так:

[
  { type: "day", value: "15" },
  { type: "literal", value: "." },
  { type: "month", value: "01" },
  { type: "literal", value: "." },
  { type: "year", value: "2026" }
]

Значение разбиения на части

Разделение даты на компоненты используется для:

  • кастомного рендеринга интерфейсов
  • вставки HTML-разметки между элементами
  • стилизации отдельных частей даты
  • создания адаптивных шаблонов отображения

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

Каждый компонент даты в Globalize зависит от локали. Это означает, что один и тот же объект Date может быть представлен совершенно по-разному.

Особенности локализации:

  • порядок компонентов (день/месяц/год)
  • разделители (точка, слэш, дефис)
  • формат часов (12/24)
  • названия месяцев и дней недели
  • использование ведущих нулей

CLDR предоставляет правила, определяющие эти параметры для каждой локали.


Форматирование времени как набор компонентов

Временные компоненты часто комбинируются в различных конфигурациях:

  • Hms — часы, минуты, секунды (24-часовой формат)
  • hms — часы, минуты, секунды (12-часовой формат)
  • Hm — часы и минуты

Пример:

Globalize.formatDate(new Date(2026, 0, 15, 18, 45), {
  skeleton: "Hm"
});

В разных локалях результат может отличаться:

  • 18:45
  • 6:45 PM

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

Часто дата и время рассматриваются как единый набор компонентов:

  • год + месяц + день + часы + минуты
  • дата без времени
  • только время без даты

Globalize позволяет гибко комбинировать эти части через skeleton:

Globalize.formatDate(new Date(), {
  skeleton: "yMdHm"
});

Такой подход позволяет строить универсальные форматы, не зависящие от фиксированных шаблонов.


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

При обработке дат Globalize опирается на нормализацию:

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

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


Влияние календарной системы

Хотя чаще всего используется григорианский календарь, Globalize поддерживает различные календарные системы через CLDR:

  • исламский календарь
  • японская эра
  • буддийский календарь

Каждая система изменяет смысл компонентов:

  • год может иметь другую базу отсчета
  • эра становится обязательной частью
  • месяцы могут иметь альтернативные названия

Практическая структура компонентов

Внутри Globalize дата фактически представляется как набор взаимосвязанных элементов:

  • календарные (год, месяц, день)
  • временные (час, минута, секунда)
  • контекстные (день недели, эра, квартал)

Эти компоненты не существуют изолированно — их отображение всегда определяется локалью, skeleton и правилами CLDR.


Поведение при отсутствии компонентов

При использовании неполных skeleton:

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

Например, Md может дать:

  • 01.15
  • 15/01 в зависимости от локали

Гибкость представления даты

Компоненты даты в Globalize не привязаны к одному формату отображения. Один и тот же набор данных может быть:

  • строкой для пользователя
  • структурой для UI
  • набором частей для кастомной верстки
  • объектом для дальнейшей обработки

Такое разделение делает систему независимой от конкретных форматов и упрощает поддержку мультиязычных интерфейсов.