Форматтеры дат

Форматирование дат в Globalize строится на данных CLDR (Common Locale Data Repository), где для каждой локали описаны правила отображения календарных значений: порядок компонентов даты, разделители, названия месяцев и дней недели, предпочтительные форматы времени и нюансы часовых поясов. Библиотека не содержит собственных «жёстко заданных» шаблонов — она опирается на стандартизированные локализационные наборы, что делает вывод дат предсказуемым и согласованным с региональными ожиданиями.

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


В основе лежит разделение на три уровня:

  • локаль (locale) — определяет язык и региональные правила;
  • тип данных (date / time / datetime) — задаёт, что именно форматируется;
  • представление (skeleton / preset) — определяет степень детализации.

Форматтер не работает с «строковыми шаблонами» напрямую в привычном смысле dd.MM.yyyy. Вместо этого используются абстрактные описания формата, которые преобразуются в конкретные правила на основе CLDR.


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

Базовый форматтер создаётся через Globalize.dateFormatter. Он возвращает функцию, которая принимает объект Date и выдаёт локализованную строку.

import Globalize from "globalize";

// предполагается, что CLDR данные уже загружены и глобализация инициализирована
const formatDate = Globalize.dateFormatter({ date: "medium" });

formatDate(new Date(2026, 4, 28));

Параметр date принимает стандартные пресеты:

  • "short" — максимально компактный формат;
  • "medium" — сбалансированное представление;
  • "long" — расширенный формат с более полным отображением;
  • "full" — максимально подробный формат с днём недели.

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


Форматирование даты и времени

Помимо чистой даты, поддерживается комбинированное форматирование:

const formatDateTime = Globalize.dateFormatter({
  datetime: "full"
});

formatDateTime(new Date());

Здесь datetime объединяет правила для даты и времени, используя предопределённые шаблоны CLDR.

Также можно комбинировать уровни детализации:

const formatCustom = Globalize.dateFormatter({
  date: "long",
  time: "short"
});

formatCustom(new Date());

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


Skeleton-подход к форматированию

Помимо готовых пресетов, Globalize поддерживает skeleton formatting — абстрактное описание требуемых компонентов даты без привязки к конкретному порядку или разделителям.

Skeleton описывает состав, а не строку.

const formatSkeleton = Globalize.dateFormatter({
  skeleton: "yMd"
});

formatSkeleton(new Date());

В данном случае:

  • y — год
  • M — месяц
  • d — день

CLDR сам определяет, как это должно выглядеть в выбранной локали: где ставить точки, пробелы или слэши.

Более сложный пример:

const formatDetailed = Globalize.dateFormatter({
  skeleton: "yMMMMEEEEd"
});

Здесь добавляются:

  • полное название месяца (MMMM)
  • день недели (EEEE)
  • полный формат даты

Отличие skeleton от preset

Preset (short, medium, long, full) задаёт готовую стратегию отображения.

Skeleton задаёт состав компонентов без фиксации оформления.

Подход Уровень контроля Зависимость от CLDR
preset низкий высокая
skeleton средний/высокий высокая

Skeleton используется в случаях, когда требуется гибкость при сохранении локализации.


Форматирование в разные локали

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

Globalize.locale("en");
const enFormatter = Globalize.dateFormatter({ date: "medium" });

Globalize.locale("ru");
const ruFormatter = Globalize.dateFormatter({ date: "medium" });

Форматтеры зависят от локали, в которой они были созданы. Это означает, что изменение Globalize.locale() не влияет на уже созданные функции форматирования.

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


Временные зоны и их влияние

Globalize работает с объектами Date JavaScript, которые уже содержат локальное представление времени. При форматировании библиотека применяет правила отображения, но не выполняет полноценную конвертацию часовых поясов.

Поэтому:

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

Части даты: форматтер по сегментам

В некоторых сценариях требуется не строка целиком, а разложенные компоненты. Для этого используется dateToPartsFormatter.

const partsFormatter = Globalize.dateToPartsFormatter({
  date: "medium"
});

partsFormatter(new Date());

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

[
  { type: "year", value: "2026" },
  { type: "month", value: "05" },
  { type: "day", value: "28" }
]

Такой формат удобен для:

  • кастомной верстки календарных интерфейсов;
  • подсветки отдельных компонентов даты;
  • построения сложных UI-компонентов без потери локализации.

Использование числовых компонентов в формате даты

Skeleton позволяет управлять представлением числовых элементов:

  • yy — двузначный год;
  • yyyy — полный год;
  • MM — числовой месяц;
  • MMM — сокращённое название месяца;
  • MMMM — полное название месяца.

Пример:

Globalize.dateFormatter({ skeleton: "yyyy-MM-dd" });

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


Календарные системы

Globalize опирается на CLDR, который поддерживает различные календарные системы (григорианский, исламский, японский и другие). Однако JavaScript Date всегда хранит время в григорианской системе, поэтому форматирование осуществляется через трансформацию отображения.

Это означает:

  • внутреннее представление не меняется;
  • изменяется только визуальная интерпретация;
  • выбор календаря определяется локалью и данными CLDR.

Поведение при отсутствии данных CLDR

Если отсутствуют необходимые данные локали:

  • форматирование может откатиться к базовой локали;
  • возможны упрощённые шаблоны;
  • некоторые компоненты (например, названия месяцев) могут отображаться некорректно.

Поэтому корректная загрузка CLDR данных является обязательным условием работы форматтеров дат.


Переиспользование форматтеров

Форматтеры создаются как функции и могут вызываться многократно без повторной инициализации:

const format = Globalize.dateFormatter({ date: "short" });

format(new Date(2026, 0, 1));
format(new Date(2026, 1, 15));
format(new Date(2026, 4, 28));

Это особенно важно в высоконагруженных приложениях, где форматирование дат происходит часто (таблицы, ленты событий, журналы активности).


Комбинирование с другими форматтерами

Форматтеры дат часто используются вместе с числовыми и валютными форматтерами Globalize для построения комплексного локализованного интерфейса:

  • дата события;
  • числовые показатели;
  • денежные значения;
  • проценты и рейтинги.

Единая система CLDR обеспечивает согласованность отображения всех этих типов данных внутри одной локали.