Библиотека Globalize использует данные стандарта CLDR для корректного отображения календарей, эпох, названий периодов времени и локализованных обозначений дат. Поддержка эр особенно важна при работе с историческими датами, японским календарём, буддийским летоисчислением и другими системами, отличающимися от григорианского календаря.
Globalize не хранит календарные данные самостоятельно. Все сведения об эрах, форматах дат и периодах времени поступают из CLDR через библиотеку Cldr.js.
Для работы с датами и календарями подключаются основные зависимости:
const Globalize = require("globalize");
require("cldr-data").entireSupplemental();
require("cldr-data").entireMainFor("ru", "en", "ja");
Globalize.load(
require("cldr-data/supplemental/likelySubtags.json"),
require("cldr-data/supplemental/timeData.json"),
require("cldr-data/supplemental/weekData.json"),
require("cldr-data/main/ru/ca-gregorian.json"),
require("cldr-data/main/en/ca-gregorian.json"),
require("cldr-data/main/ja/ca-japanese.json")
);
После загрузки данных создаётся объект локализации:
const ru = new Globalize("ru");
const en = new Globalize("en");
const ja = new Globalize("ja");
Эра — это исторический или календарный период, используемый для отсчёта лет.
Примеры:
CLDR хранит:
Globalize использует эти данные автоматически при форматировании даты.
Для отображения эпох применяются специальные символы шаблона даты.
GСимвол G отвечает за отображение эры.
Количество символов определяет стиль вывода.
| Формат | Результат |
|---|---|
| G | н.э. |
| GG | н.э. |
| GGG | н.э. |
| GGGG | нашей эры |
| GGGGG | н |
const formatter = ru.dateFormatter({
datetime: "medium",
raw: "d MMMM y G"
});
console.log(formatter(new Date()));
Результат:
5 марта 2026 н.э.
const formatter = ru.dateFormatter({
raw: "d MMMM y GGGG"
});
console.log(formatter(new Date()));
Результат:
5 марта 2026 нашей эры
const formatter = ru.dateFormatter({
raw: "d.MM.y GGGGG"
});
console.log(formatter(new Date()));
Результат:
05.03.2026 н
const formatter = en.dateFormatter({
raw: "MMMM d, y G"
});
console.log(formatter(new Date()));
Результат:
March 5, 2026 AD
Полная форма:
const formatter = en.dateFormatter({
raw: "MMMM d, y GGGG"
});
Результат:
March 5, 2026 Anno Domini
Javascript использует астрономическое представление годов.
Год 0 соответствует 1 BC.
Пример:
const ancientDate = new Date(-44, 2, 15);
const formatter = en.dateFormatter({
raw: "d MMM y G"
});
console.log(formatter(ancientDate));
Результат:
15 Mar 45 BC
Следует учитывать особенности объекта Date:
Одной из наиболее интересных возможностей CLDR является поддержка японского императорского календаря.
В Японии годы часто указываются относительно правления императора.
Примеры эпох:
| Эра | Начало |
|---|---|
| Meiji | 1868 |
| Taisho | 1912 |
| Showa | 1926 |
| Heisei | 1989 |
| Reiwa | 2019 |
Globalize.load(
require("cldr-data/main/ja/ca-japanese.json")
);
const ja = new Globalize("ja");
const formatter = ja.dateFormatter({
date: "long",
skeleton: "GyMMMd"
});
console.log(formatter(new Date(2020, 4, 1)));
Результат:
令和2年5月1日
Здесь:
令和 — эпоха Reiwa;2年 — второй год эпохи.const formatter = ja.dateFormatter({
raw: "GGGG y年M月d日"
});
Результат:
令和 2年5月1日
CLDR хранит несколько вариантов отображения эр:
Сокращённый вариант.
AD
BC
Полное название.
Anno Domini
Before Christ
Минимальная форма.
A
B
Globalize выбирает нужную форму автоматически по длине шаблона
G.
Globalize поддерживает локализованные периоды времени:
Эти данные также поступают из CLDR.
const formatter = ru.dateFormatter({
raw: "h:mm a"
});
console.log(formatter(new Date(2026, 2, 5, 9, 30)));
Результат:
9:30 AM
Для русского языка стандартные обозначения могут отличаться в зависимости от версии CLDR.
const formatter = en.dateFormatter({
raw: "h:mm a"
});
console.log(formatter(new Date(2026, 2, 5, 21, 15)));
Результат:
9:15 PM
CLDR содержит расширенные периоды суток:
| Период | Пример |
|---|---|
| morning | утро |
| afternoon | день |
| evening | вечер |
| night | ночь |
Некоторые локали используют их автоматически.
BСовременный формат Unicode поддерживает символ B для
расширенных периодов суток.
const formatter = en.dateFormatter({
raw: "h B"
});
Возможные результаты:
9 at night
11 in the morning
3 in the afternoon
const formatter = ru.dateFormatter({
raw: "H B"
});
Результат может выглядеть так:
22 ночью
Поддержка зависит от версии CLDR и реализации Intl в окружении.
Некоторые локали различают:
Пример:
const formatter = en.dateFormatter({
raw: "h:mm B"
});
console.log(formatter(new Date(2026, 2, 5, 0, 0)));
console.log(formatter(new Date(2026, 2, 5, 12, 0)));
Результат:
12:00 midnight
12:00 noon
Skeleton позволяет Globalize самостоятельно подобрать локализованный шаблон.
Пример:
const formatter = ru.dateFormatter({
skeleton: "GyMMMd"
});
Здесь:
G — эра;y — год;MMM — месяц;d — день.Точный шаблон.
raw: "d MMMM y G"
Полный контроль над выводом.
Гибкий локализованный формат.
skeleton: "GyMMMd"
Globalize сам определяет:
Иногда требуется получить сведения об эпохах вручную.
Пример через Cldr.js:
const Cldr = require("cldrjs");
const cldr = new Cldr("en");
const eras = cldr.main("dates/calendars/gregorian/eras");
console.log(eras);
Результат содержит:
{
eraNames: {
0: "Before Christ",
1: "Anno Domini"
}
}
CLDR поддерживает множество календарных систем:
| Календарь | Особенности |
|---|---|
| gregorian | стандартный григорианский |
| japanese | японские эпохи |
| buddhist | буддийское летоисчисление |
| islamic | исламский календарь |
| roc | календарь Китайской Республики |
| persian | персидский календарь |
В буддийском календаре годы смещены относительно григорианского.
Пример:
Globalize.load(
require("cldr-data/main/th/ca-buddhist.json")
);
const th = new Globalize("th");
Форматирование:
const formatter = th.dateFormatter({
raw: "d MMMM y G"
});
Результат:
5 มีนาคม 2569 พ.ศ.
Некоторые локали позволяют явно выбирать календарь через Unicode Extension.
Пример:
const jaJapanese = new Globalize("ja-u-ca-japanese");
Теперь форматирование использует японский календарь автоматически.
Расширение u-ca определяет календарную систему.
Примеры:
| Значение | Календарь |
|---|---|
| u-ca-gregory | григорианский |
| u-ca-japanese | японский |
| u-ca-buddhist | буддийский |
| u-ca-islamic | исламский |
function createFormatter(locale) {
const globalize = new Globalize(locale);
return globalize.dateFormatter({
skeleton: "GyMMMd"
});
}
const formatRu = createFormatter("ru");
const formatJa = createFormatter("ja-u-ca-japanese");
console.log(formatRu(new Date()));
console.log(formatJa(new Date()));
Возможный результат:
5 мар. 2026 г. н.э.
令和8年3月5日
Globalize активно использует возможности
Intl.DateTimeFormat.
Поддержка эр зависит от:
Старые окружения могут:
B;console.log(
Intl.DateTimeFormat.supportedLocalesOf([
"ja-u-ca-japanese"
])
);
Если массив пуст, календарь не поддерживается.
Ошибка:
E_MISSING_CLDR
Причина:
require("cldr-data/main/ja/ca-japanese.json")
не был подключён.
skeleton: "GGGG"
Skeleton не предназначен для точного форматирования эпох.
Для таких случаев лучше использовать raw.
В некоторых сборках Node.js доступны только английские данные.
Проверка:
console.log(Intl.DateTimeFormat().resolvedOptions());
Полный набор данных CLDR может занимать значительный объём.
Часто загружают только необходимые календари:
Globalize.load(
require("cldr-data/main/ru/ca-gregorian.json"),
require("cldr-data/main/ja/ca-japanese.json")
);
Это уменьшает размер приложения.
const formatter = en.dateFormatter({
raw: "EEEE, MMMM d, y G 'at' h:mm:ss a"
});
console.log(formatter(new Date()));
Результат:
Thursday, March 5, 2026 AD at 9:41:12 PM
const formatter = en.dateFormatter({
raw: "y G"
});
console.log(formatter(new Date(-500, 0, 1)));
Результат:
501 BC
function createEraFormatter(locale, pattern) {
const globalize = new Globalize(locale);
return globalize.dateFormatter({
raw: pattern
});
}
const formatter = createEraFormatter(
"en",
"d MMM y GGGG"
);
console.log(formatter(new Date()));
const locales = [
"en",
"ru",
"ja-u-ca-japanese"
];
locales.forEach(locale => {
const formatter = new Globalize(locale)
.dateFormatter({
skeleton: "GyMMMd"
});
console.log(locale, formatter(new Date()));
});
Возможный вывод:
en Mar 5, 2026 AD
ru 5 мар. 2026 г. н.э.
ja-u-ca-japanese 令和8年3月5日