Библиотека Globalize предоставляет механизм интернационализации приложений на основе стандарта CLDR (Common Locale Data Repository). Одной из важных возможностей является распознавание строковых представлений дат с учётом локали пользователя.
Разные страны используют различные форматы:
| Локаль | Формат | Пример |
|---|---|---|
| en-US | MM/dd/yyyy | 12/25/2025 |
| en-GB | dd/MM/yyyy | 25/12/2025 |
| de | dd.MM.yyyy | 25.12.2025 |
| ja | yyyy/MM/dd | 2025/12/25 |
Без учёта локализации невозможно корректно определить, что означает
строка 03/04/2025: 3 апреля или 4 марта.
Globalize решает эту проблему через локализованный парсинг дат.
Для работы с датами требуется модуль globalize/date.
const Globalize = require("globalize");
require("cldr-data").entireSupplemental();
require("cldr-data").entireMainFor("en", "ru");
Globalize.load(
require("cldr-data/supplemental/likelySubtags.json"),
require("cldr-data/main/en/ca-gregorian.json"),
require("cldr-data/main/en/timeZoneNames.json"),
require("cldr-data/main/en/numbers.json"),
require("cldr-data/main/ru/ca-gregorian.json"),
require("cldr-data/main/ru/timeZoneNames.json"),
require("cldr-data/main/ru/numbers.json")
);
После загрузки данных можно создавать экземпляры локалей:
const en = new Globalize("en");
const ru = new Globalize("ru");
Основной метод распознавания дат:
globalize.parseDate(value, options)
Возвращает:
Datenull, если строка не соответствует форматуconst ru = new Globalize("ru");
const result = ru.parseDate("25.12.2025");
console.log(result);
Результат:
2025-12-24T21:00:00.000Z
Объект хранится в UTC, поэтому отображение зависит от часового пояса среды выполнения.
const date = ru.parseDate("25.12.2025", {
skeleton: "yMd"
});
Параметр skeleton определяет ожидаемую структуру
даты.
Наиболее распространённые шаблоны:
| Skeleton | Значение |
|---|---|
| yMd | дата |
| yMMMd | дата с текстовым месяцем |
| yMEd | дата + день недели |
| Hm | часы и минуты |
| Hms | время с секундами |
| GyMMMd | дата с эрой |
const ru = new Globalize("ru");
const date = ru.parseDate("25 декабря 2025 г.", {
skeleton: "yMMMd"
});
console.log(date);
const en = new Globalize("en");
const date = en.parseDate("December 25, 2025", {
skeleton: "yMMMd"
});
console.log(date);
Одна и та же строка может интерпретироваться по-разному.
const en = new Globalize("en");
const ru = new Globalize("ru");
console.log(
en.parseDate("03/04/2025", {
skeleton: "yMd"
})
);
console.log(
ru.parseDate("03.04.2025", {
skeleton: "yMd"
})
);
В английской локали:
March 4
В русской локали:
3 April
Globalize не пытается «угадывать» формат.
Если шаблон не совпадает, результатом будет null.
const ru = new Globalize("ru");
const date = ru.parseDate("2025-12-25", {
skeleton: "yMd"
});
console.log(date);
Результат:
null
Для многократного распознавания рекомендуется заранее компилировать парсер.
const parser = ru.dateParser({
skeleton: "yMd"
});
console.log(parser("25.12.2025"));
console.log(parser("01.01.2026"));
Метод parseDate:
Dateconst ru = new Globalize("ru");
const time = ru.parseDate("18:45", {
skeleton: "Hm"
});
console.log(time);
const ru = new Globalize("ru");
const result = ru.parseDate(
"25.12.2025, 18:45:10",
{
skeleton: "yMdHms"
}
);
console.log(result);
Американский формат времени:
const en = new Globalize("en");
const result = en.parseDate(
"12/25/2025 10:30 PM",
{
skeleton: "yMdhm"
}
);
console.log(result);
const en = new Globalize("en");
const result = en.parseDate(
"Thu, Dec 25, 2025",
{
skeleton: "E yMMMd"
}
);
console.log(result);
const parser = ru.dateParser({
skeleton: "yMd"
});
const result = parser("неверная дата");
if (result === null) {
console.log("Ошибка формата");
}
function validateDate(value) {
const parser = ru.dateParser({
skeleton: "yMd"
});
return parser(value) !== null;
}
console.log(validateDate("25.12.2025"));
console.log(validateDate("99.99.9999"));
Globalize валидирует реальные даты.
const result = ru.parseDate("31.02.2025", {
skeleton: "yMd"
});
console.log(result);
Результат:
null
Globalize ориентирован на локализованные форматы, а не ISO.
Для ISO лучше использовать встроенный Jav * aScript:
const date = new Date("2025-12-25T10:30:00");
Либо:
Date.parse("2025-12-25T10:30:00");
Вместо сокращённого шаблона можно использовать точный pattern.
const parser = ru.dateParser({
raw: "dd.MM.yyyy"
});
console.log(parser("25.12.2025"));
{
skeleton: "yMd"
}
{
raw: "dd.MM.yyyy"
}
const ru = new Globalize("ru");
const result = ru.parseDate(
"25 дек. 2025",
{
skeleton: "yMMMd"
}
);
console.log(result);
Часто приложение поддерживает несколько форматов ввода.
const parsers = [
ru.dateParser({ raw: "dd.MM.yyyy" }),
ru.dateParser({ raw: "dd/MM/yyyy" }),
ru.dateParser({ raw: "yyyy-MM-dd" })
];
function parse(value) {
for (const parser of parsers) {
const result = parser(value);
if (result) {
return result;
}
}
return null;
}
const result = ru.parseDate(
"12.2025",
{
raw: "MM.yyyy"
}
);
console.log(result);
Если отсутствуют некоторые компоненты, Globalize использует значения по умолчанию.
const result = ru.parseDate(
"12.2025",
{
raw: "MM.yyyy"
}
);
В большинстве случаев:
100:00:00Globalize использует CLDR и может работать с:
При этом требуется загрузка соответствующих CLDR-данных.
const ja = new Globalize("ja");
const result = ja.parseDate(
"令和7年12月25日",
{
skeleton: "GyMd"
}
);
console.log(result);
for (const value of values) {
const date = ru.parseDate(value, {
skeleton: "yMd"
});
}
Здесь шаблон создаётся заново при каждой итерации.
const parser = ru.dateParser({
skeleton: "yMd"
});
for (const value of values) {
const date = parser(value);
}
Библиотека не поддерживает:
сегодня
завтра
next friday
2 days ago
Globalize предназначен только для строгого форматного распознавания.
Globalize не определяет язык входной строки автоматически.
Неверный пример:
globalize.parseDate("25 décembre 2025");
Необходимо явно использовать французскую локаль.
Globalize часто применяется совместно со встроенным API
Intl.
const formatter = new Intl.DateTimeFormat("ru-RU");
console.log(
formatter.format(new Date())
);
const parser = ru.dateParser({
skeleton: "yMd"
});
console.log(
parser("25.12.2025")
);
25.12.2025
const date = parser(input);
database.save(date.toISOString());
formatter.format(date);
Ошибка:
E_MISSING_CLDR
Причина:
ca-gregoriantimeZoneNamesconst ru = new Globalize("ru");
ru.parseDate("12/25/2025", {
skeleton: "yMd"
});
Результат:
null
ru.parseDate("25.12.2025", {
skeleton: "Hm"
});
Парсер ожидает время, а получает дату.
const parser = ru.dateParser({
raw: "dd.MM.yyyy"
});
function handleBirthDate(value) {
const date = parser(value);
if (!date) {
return {
valid: false,
message: "Неверный формат даты"
};
}
return {
valid: true,
value: date
};
}
const parser = en.dateParser({
raw: "MM/dd/yyyy"
});
for (const row of csvRows) {
row.date = parser(row.dateString);
}
| Библиотека | Локализация | Строгий парсинг | CLDR |
|---|---|---|---|
| Globalize | Да | Да | Да |
| Moment.js | Частично | Да | Нет |
| Day.js | Ограниченно | Частично | Нет |
| date-fns | Через модули | Да | Нет |
Наиболее подходящие сценарии:
Внутренне dateParser() возвращает функцию:
function parser(value) {
// parsing logic
}
Эта функция:
Globalize одинаково работает:
Однако CLDR-данные необходимо загружать отдельно для каждой среды.
const parser = globalize.dateParser({
skeleton: "yMd"
});
function onChange(event) {
const value = event.target.value;
const date = parser(value);
setDate(date);
}
methods: {
parse(value) {
return this.globalize.parseDate(
value,
{ skeleton: "yMd" }
);
}
}
import Globalize from "globalize";
const globalize = new Globalize("ru");
const parser = globalize.dateParser({
skeleton: "yMd"
});
const result: Date | null =
parser("25.12.2025");
class DateService {
constructor(locale) {
this.globalize = new Globalize(locale);
this.parser = this.globalize.dateParser({
skeleton: "yMd"
});
}
parse(value) {
return this.parser(value);
}
}
Создание парсера — дорогая операция.
Рекомендуется:
Перед парсингом желательно:
value = value.trim();
Также полезно:
В разных локалях используются:
| Символ | Пример |
|---|---|
/ |
12/25/2025 |
. |
25.12.2025 |
- |
2025-12-25 |
年 |
2025年12月25日 |
Globalize учитывает эти особенности автоматически через CLDR.