Globalize опирается на CLDR (Unicode Common Locale Data Repository), благодаря чему поддержка временных форматов — одна из наиболее точных и гибких частей библиотеки. Прошедшее и будущее время в контексте Globalize выражаются не через отдельные «магические» функции языка, а через комбинацию локализованных правил: относительное время, форматирование дат и языковые сообщения.
Работа с временными формами начинается с загрузки данных CLDR. Без них невозможно корректно вычислять формы прошедшего и будущего времени, поскольку именно CLDR содержит:
Минимальный набор инициализации:
import Globalize from "globalize";
import cldr from "cldrjs";
import "globalize/dist/globalize-runtime";
// загрузка CLDR-данных (упрощённый пример)
Globalize.load(
require("cldr-data/main/ru/ca-gregorian"),
require("cldr-data/main/ru/numbers"),
require("cldr-data/supplemental/likelySubtags"),
require("cldr-data/supplemental/plurals"),
require("cldr-data/supplemental/timeData")
);
Globalize.locale("ru");
После этого становятся доступны механизмы, которые различают «5 минут назад» и «через 5 минут» не только синтаксически, но и грамматически корректно.
Ключевой механизм — относительное время. Оно описывает интервал относительно текущего момента.
Прошедшее время формируется при отрицательных значениях интервалов:
const g = Globalize("ru");
g.formatRelativeTime(-5, "minute");
// "5 минут назад"
Смысловая модель:
Типовые единицы:
Пример масштабирования:
g.formatRelativeTime(-2, "hour"); // "2 часа назад"
g.formatRelativeTime(-1, "day"); // "1 день назад"
g.formatRelativeTime(-3, "month"); // "3 месяца назад"
Будущее время выражается положительными значениями:
g.formatRelativeTime(10, "minute");
// "через 10 минут"
Механика симметрична:
g.formatRelativeTime(2, "hour"); // "через 2 часа"
g.formatRelativeTime(7, "day"); // "через 7 дней"
g.formatRelativeTime(1, "year"); // "через 1 год"
Сложность прошедшего и будущего времени в локализации заключается не в вычислении интервала, а в выборе формы слова.
CLDR предоставляет правила плюрализации, которые Globalize применяет автоматически:
Та же логика применяется в будущем времени:
Пример влияния на результат:
g.formatRelativeTime(-1, "minute"); // "1 минута назад"
g.formatRelativeTime(-2, "minute"); // "2 минуты назад"
g.formatRelativeTime(-5, "minute"); // "5 минут назад"
Относительное время часто комбинируется с абсолютным форматированием дат.
const date = new Date(Date.now() - 3600 * 1000);
g.formatDate(date, { datetime: "medium" });
Результат зависит от локали, но логически отображает прошедший момент как фиксированную дату и время.
const future = new Date(Date.now() + 2 * 24 * 3600 * 1000);
g.formatDate(future, { datetime: "medium" });
Это используется там, где относительное время теряет точность (например, расписания).
В реальных интерфейсах применяется комбинированная логика:
Пример условной логики:
const diff = (date - Date.now()) / 1000;
if (Math.abs(diff) < 60 * 60 * 24) {
g.formatRelativeTime(Math.round(diff / 60), "minute");
} else {
g.formatDate(date, { datetime: "short" });
}
Такой подход делает отображение времени одновременно компактным и информативным.
Globalize использует набор шаблонов, зависящих от языка:
CLDR определяет эти конструкции, а Globalize подставляет значения.
В некоторых случаях стандартных единиц недостаточно. Тогда используется уровень сообщений:
Globalize.loadMessages({
ru: {
"time-past": "{0} назад",
"time-future": "через {0}"
}
});
Далее можно строить более сложные выражения:
const g = Globalize("ru");
const value = g.formatNumber(5);
g.messageFormatter("time-past")(value + " минут");
Хотя это уже выходит за рамки стандартного API относительного времени, механизм сообщений позволяет адаптировать логику под специфические требования интерфейса.
При переходах между единицами времени Globalize учитывает правила округления:
Пример:
g.formatRelativeTime(-59, "second");
g.formatRelativeTime(-60, "second");
Фактическое отображение зависит от внутренней нормализации единиц.
В разных локалях меняется не только язык, но и структура выражения:
Globalize не фиксирует синтаксис, а опирается на CLDR, что обеспечивает универсальность обработки прошедшего и будущего времени.
При работе с API и данными серверов часто используются UNIX timestamp или ISO строки:
const g = Globalize("ru");
const pastDate = new Date("2026-05-25T10:00:00Z");
const diffMinutes = (pastDate - new Date()) / 60000;
g.formatRelativeTime(diffMinutes, "minute");
Такая модель позволяет унифицировать обработку временных данных независимо от источника.
Для больших систем используется нормализация интервалов:
Пример:
function formatTimeDiff(ms) {
const minutes = ms / 60000;
if (Math.abs(minutes) < 60) {
return g.formatRelativeTime(minutes, "minute");
}
const hours = minutes / 60;
if (Math.abs(hours) < 24) {
return g.formatRelativeTime(hours, "hour");
}
const days = hours / 24;
return g.formatRelativeTime(days, "day");
}
Такой подход обеспечивает предсказуемое отображение как прошедших, так и будущих событий.
Globalize обеспечивает единый контракт:
Это позволяет использовать одну и ту же логику для: