В экосистеме интернационализации JavaScript библиотека Globalize опирается на данные CLDR (Common Locale Data Repository), где календарные системы являются одной из базовых категорий локализационных правил. Наиболее распространённой календарной системой остаётся та, которая используется в международной практике по умолчанию — солнечный календарь с фиксированной структурой месяцев и високосных лет, применяемый в большинстве цифровых систем и API.
В Globalize работа с датами строится поверх CLDR, где календарь описывает не только структуру дат, но и правила форматирования, отображения и парсинга. В контексте JavaScript это означает, что библиотека не изобретает собственную календарную модель, а использует стандартизированное описание, соответствующее Unicode Locale Data.
CLDR предоставляет календарные данные в виде иерархической структуры:
Globalize загружает эти данные через JSON-файлы CLDR и использует их для построения форматтеров.
Пример набора подключаемых данных:
import Globalize from "globalize";
// Core CLDR data
import likelySubtags from "cldr-core/supplemental/likelySubtags.json";
import timeData from "cldr-core/supplemental/timeData.json";
import weekData from "cldr-core/supplemental/weekData.json";
// Locale-specific data
import numbers from "cldr-numbers-full/main/en/numbers.json";
import caGregorian from "cldr-dates-full/main/en/ca-gregorian.json";
import dateFields from "cldr-dates-full/main/en/dateFields.json";
// Load into Globalize
Globalize.load(
likelySubtags,
timeData,
weekData,
numbers,
caGregorian,
dateFields
);
Файл ca-gregorian.json содержит описание календаря,
который используется в большинстве локалей как основной.
Системный календарь, применяемый по умолчанию в CLDR для большинства локалей, представляет собой солнечную календарную систему с:
Globalize использует эту систему как базовую при форматировании дат, если локаль не переопределяет календарь.
Календарь влияет на:
Основная операция работы с календарём — форматирование даты в строку с учётом локали.
const globalize = new Globalize("en");
const formatter = globalize.dateFormatter({
datetime: "full"
});
console.log(formatter(new Date()));
Результат зависит от CLDR-данных для соответствующей локали, включая календарную систему.
Форматы:
short — минимальный формат;medium — сбалансированный формат;long — расширенный формат;full — максимально подробный формат.Каждый элемент календаря обрабатывается отдельно через CLDR:
const monthFormatter = globalize.cldr.main("dates/calendars/calendar[@type='gregorian']/months/stand-alone/wide");
Однако чаще используется высокоуровневый API:
const formatter = globalize.dateFormatter({ skeleton: "MMMM" });
console.log(formatter(new Date()));
skeleton позволяет описывать формат без привязки к
конкретному языковому представлению.
CLDR определяет разные формы дней недели:
Globalize автоматически выбирает корректный вариант:
const formatter = globalize.dateFormatter({ skeleton: "EEEE" });
console.log(formatter(new Date()));
Помимо форматирования, Globalize поддерживает обратную операцию —
преобразование строки в объект Date.
const parser = globalize.dateParser({ skeleton: "yMd" });
const date = parser("27/05/2026");
console.log(date);
Парсинг зависит от:
Скелетоны (skeletons) представляют собой абстрактное описание формата, независимое от конкретного языка.
Примеры:
y — год;M — месяц;d — день;H — часы 24-часового формата;m — минуты;s — секунды.Комбинации:
const f1 = globalize.dateFormatter({ skeleton: "yMMMMd" });
const f2 = globalize.dateFormatter({ skeleton: "EHm" });
Эти конструкции интерпретируются через календарную модель, где Gregorian-календарь задаёт базовую временную шкалу.
Календарь в Globalize тесно связан с временными форматами:
const timeFormatter = globalize.dateFormatter({ time: "medium" });
console.log(timeFormatter(new Date()));
CLDR определяет:
Хотя Gregorian-календарь является доминирующим, локаль влияет на представление:
en-US использует формат MM/DD/YYYY;en-GB — DD/MM/YYYY;de-DE — DD.MM.YYYY.Globalize не меняет календарную систему, но изменяет интерпретацию порядка компонентов.
const us = new Globalize("en-US");
const gb = new Globalize("en-GB");
const date = new Date(2026, 4, 27);
console.log(us.dateFormatter({ skeleton: "yMd" })(date));
console.log(gb.dateFormatter({ skeleton: "yMd" })(date));
Gregorian-календарь включает правило високосного года:
Globalize не реализует эти правила вручную, а опирается на встроенный
объект Date, который уже учитывает корректную модель
календаря ECMAScript.
CLDR предоставляет паттерны, которые Globalize применяет динамически:
const formatter = globalize.dateFormatter({
datetime: "long"
});
Внутри происходит:
Архитектура Globalize разделяет:
Такое разделение позволяет:
Модуль dateFields описывает относительные временные
выражения:
const relativeFormatter = globalize.relativeTimeFormatter("day");
console.log(relativeFormatter(-1));
console.log(relativeFormatter(3));
Хотя эти выражения не являются частью строгого календаря, они зависят от его структуры и единиц измерения.
Работа с диапазонами дат также использует календарную модель:
const start = new Date(2026, 0, 1);
const end = new Date(2026, 11, 31);
const formatter = globalize.dateFormatter({ datetime: "medium" });
console.log(formatter(start) + " — " + formatter(end));
CLDR обеспечивает корректное отображение границ периода в соответствии с локалью.
При использовании Globalize календарная система влияет на:
Gregorian-календарь обеспечивает совместимость между системами и минимизирует неоднозначности при обмене данными.
Несмотря на универсальность, календарная модель в Globalize имеет ограничения: