Форматирование дат в Globalize строится на данных CLDR (Common Locale Data Repository), где для каждой локали описаны правила отображения календарных значений: порядок компонентов даты, разделители, названия месяцев и дней недели, предпочтительные форматы времени и нюансы часовых поясов. Библиотека не содержит собственных «жёстко заданных» шаблонов — она опирается на стандартизированные локализационные наборы, что делает вывод дат предсказуемым и согласованным с региональными ожиданиями.
Основной механизм работы с датами в Globalize реализован через форматтеры, которые создаются заранее и затем применяются многократно. Такой подход снижает накладные расходы, так как разбор локали и выбор правил форматирования выполняются один раз.
В основе лежит разделение на три уровня:
Форматтер не работает с «строковыми шаблонами» напрямую в привычном
смысле 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());
Такой подход позволяет отдельно контролировать точность представления даты и времени.
Помимо готовых пресетов, 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)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" }
]
Такой формат удобен для:
Skeleton позволяет управлять представлением числовых элементов:
yy — двузначный год;yyyy — полный год;MM — числовой месяц;MMM — сокращённое название месяца;MMMM — полное название месяца.Пример:
Globalize.dateFormatter({ skeleton: "yyyy-MM-dd" });
Хотя строка выглядит знакомо, её интерпретация всё равно определяется CLDR и может отличаться по локали.
Globalize опирается на CLDR, который поддерживает различные
календарные системы (григорианский, исламский, японский и другие).
Однако JavaScript Date всегда хранит время в григорианской
системе, поэтому форматирование осуществляется через трансформацию
отображения.
Это означает:
Если отсутствуют необходимые данные локали:
Поэтому корректная загрузка 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 обеспечивает согласованность отображения всех этих типов данных внутри одной локали.