Григорианский календарь

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

В Globalize работа с датами строится поверх CLDR, где календарь описывает не только структуру дат, но и правила форматирования, отображения и парсинга. В контексте JavaScript это означает, что библиотека не изобретает собственную календарную модель, а использует стандартизированное описание, соответствующее Unicode Locale Data.


Структура календарных данных в CLDR

CLDR предоставляет календарные данные в виде иерархической структуры:

  • набор месяцев и их локализованные названия;
  • сокращённые формы месяцев;
  • дни недели и их локализация;
  • правила первого дня недели;
  • форматы дат и времени;
  • паттерны отображения (short, medium, long, full).

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 содержит описание календаря, который используется в большинстве локалей как основной.


Роль Gregorian-календаря в Globalize

Системный календарь, применяемый по умолчанию в CLDR для большинства локалей, представляет собой солнечную календарную систему с:

  • 12 месяцами;
  • 365 или 366 днями в зависимости от високосного года;
  • фиксированными правилами перехода между годами.

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 определяет разные формы дней недели:

  • narrow (минимальная форма);
  • short (сокращённая);
  • abbreviated;
  • wide (полная форма).

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 определяет:

  • 12/24-часовой формат;
  • правила отображения AM/PM;
  • разделители времени.

Влияние локали на календарь

Хотя 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-календарь включает правило високосного года:

  • год делится на 4 → високосный;
  • исключение: годы, делящиеся на 100;
  • исключение исключения: годы, делящиеся на 400.

Globalize не реализует эти правила вручную, а опирается на встроенный объект Date, который уже учитывает корректную модель календаря ECMAScript.


Интернационализация форматов дат

CLDR предоставляет паттерны, которые Globalize применяет динамически:

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

Внутри происходит:

  • выбор шаблона из CLDR;
  • подстановка локализованных компонентов;
  • применение календарной системы.

Разделение уровня данных и логики

Архитектура Globalize разделяет:

  • данные календаря (CLDR JSON);
  • механизм форматирования;
  • API разработчика.

Такое разделение позволяет:

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

Календарные поля и dateFields

Модуль dateFields описывает относительные временные выражения:

  • «сегодня»;
  • «вчера»;
  • «через 3 дня»;
  • «в прошлом месяце».
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 календарная система влияет на:

  • UI-компоненты датапикеров;
  • серверное форматирование дат;
  • экспорт отчётности;
  • локализацию логов и событий.

Gregorian-календарь обеспечивает совместимость между системами и минимизирует неоднозначности при обмене данными.


Ограничения модели

Несмотря на универсальность, календарная модель в Globalize имеет ограничения:

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