Парсинг времени

Библиотека Globalize предоставляет механизм локализованного парсинга времени на основе стандарта CLDR и инфраструктуры ICU. В отличие от ручного разбора строк через регулярные выражения или Date.parse(), Globalize учитывает правила локали: формат часов, разделители, порядок компонентов, сокращения AM/PM и особенности конкретного языка.

Парсинг времени особенно важен в приложениях с международным интерфейсом, где пользователь вводит значения в привычном для своей культуры формате.

Подключение модулей

Для работы с временем требуется модуль даты:

<script src="cldr.js"></script>
<script src="cldr/event.js"></script>
<script src="cldr/supplemental.js"></script>
<script src="globalize.js"></script>
<script src="globalize/date.js"></script>

После подключения необходимо загрузить данные CLDR:

Globalize.load(
    cldrDataGregorian,
    cldrDataTimeData,
    cldrDataWeekData,
    cldrDataNumbers
);

Globalize.locale("ru");

Без загрузки соответствующих данных библиотека не сможет корректно распознавать временные форматы.


Метод parseDate

Основной инструмент для парсинга времени — метод parseDate().

const globalize = new Globalize("ru");

const date = globalize.parseDate("15:30", {
    skeleton: "Hm"
});

console.log(date);

Результатом становится объект Date.

Хотя метод называется parseDate, он используется и для времени. Если строка содержит только часы и минуты, остальные компоненты даты устанавливаются автоматически.


Использование skeleton

Globalize строит формат на основе CLDR-шаблонов. Вместо ручного описания структуры применяется параметр skeleton.

Формат 24 часа

const time = globalize.parseDate("21:45", {
    skeleton: "Hm"
});

Обозначения:

Символ Значение
H часы 0–23
m минуты

Формат 12 часов

const time = globalize.parseDate("09:15 PM", {
    skeleton: "hm"
});

Здесь:

Символ Значение
h часы 1–12
m минуты
a AM/PM

Для корректного разбора AM/PM обычно используется skeleton:

{
    skeleton: "hma"
}

Пример:

const time = globalize.parseDate("11:20 AM", {
    skeleton: "hma"
});

Разбор секунд

Globalize поддерживает секунды через символ s.

const time = globalize.parseDate("18:22:41", {
    skeleton: "Hms"
});

Компоненты:

Символ Значение
H часы
m минуты
s секунды

Миллисекунды

Для парсинга миллисекунд используется S.

const time = globalize.parseDate("10:15:22.357", {
    skeleton: "HmsSSS"
});

Парсинг времени в разных локалях

Русская локаль

Globalize.locale("ru");

const time = Globalize.parseDate("23:10", {
    skeleton: "Hm"
});

Американская локаль

Globalize.locale("en");

const time = Globalize.parseDate("11:10 PM", {
    skeleton: "hma"
});

Немецкая локаль

Globalize.locale("de");

const time = Globalize.parseDate("23:10", {
    skeleton: "Hm"
});

Разница проявляется в ожидаемых разделителях, формате часов и обозначениях периода суток.


Использование parseDateParser

Метод parseDate() каждый раз создает внутренний парсер. При большом количестве операций эффективнее использовать заранее скомпилированный обработчик.

const parser = Globalize.dateParser({
    skeleton: "Hms"
});

const result = parser("12:45:11");

Такой подход уменьшает накладные расходы при массовом разборе данных.


Производительность компилируемых парсеров

В крупных приложениях часто применяется предварительная компиляция:

const parser = Globalize.dateParser({
    datetime: "medium"
});

После этого функция может вызываться тысячи раз:

records.forEach(item => {
    const value = parser(item.time);
});

Это особенно важно в:

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

Строгий парсинг

Globalize придерживается строгого соответствия формату.

Пример корректного значения:

Globalize.parseDate("14:20", {
    skeleton: "Hm"
});

Некорректный ввод:

Globalize.parseDate("14-20", {
    skeleton: "Hm"
});

Результат:

null

Библиотека не пытается угадывать формат строки.


Проверка результата

После парсинга необходимо проверять результат:

const result = Globalize.parseDate(value, {
    skeleton: "Hm"
});

if (result === null) {
    console.log("Ошибка формата");
}

Это основной способ обработки пользовательских ошибок.


Парсинг пользовательского ввода

Типичный сценарий:

function parseUserTime(input) {
    return Globalize.parseDate(input, {
        skeleton: "Hm"
    });
}

Использование:

const result = parseUserTime("16:40");

if (result) {
    console.log(result.getHours());
}

Работа с AM/PM

В англоязычных локалях период суток обязателен для 12-часового формата.

Корректный пример:

Globalize.parseDate("7:30 PM", {
    skeleton: "hma"
});

Некорректный:

Globalize.parseDate("7:30", {
    skeleton: "hma"
});

Результат:

null

Парсинг времени без даты

При разборе только времени Globalize создает объект Date с базовой датой.

const value = Globalize.parseDate("08:20", {
    skeleton: "Hm"
});

console.log(value);

Объект будет содержать:

  • часы;
  • минуты;
  • секунды;
  • автоматически назначенную дату.

Для получения только времени обычно используются методы:

value.getHours()
value.getMinutes()
value.getSeconds()

Извлечение компонентов времени

const date = Globalize.parseDate("19:44:12", {
    skeleton: "Hms"
});

console.log(date.getHours());
console.log(date.getMinutes());
console.log(date.getSeconds());

Поддержка нестандартных форматов

Вместо skeleton можно использовать явный шаблон.

const parser = Globalize.dateParser({
    raw: "HH:mm:ss"
});

Пример:

const value = parser("22:10:44");

Разница между skeleton и raw

Skeleton

{
    skeleton: "Hm"
}

Преимущества:

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

Raw

{
    raw: "HH:mm"
}

Преимущества:

  • полный контроль;
  • фиксированная структура;
  • предсказуемый формат.

Использование raw-шаблонов

const parser = Globalize.dateParser({
    raw: "hh:mm a"
});

const result = parser("09:30 PM");

Символы шаблонов времени

Символ Значение
H часы 0–23
h часы 1–12
m минуты
s секунды
S миллисекунды
a AM/PM

Парсинг вместе с датой

Часто время разбирается вместе с календарной датой.

const result = Globalize.parseDate(
    "25.12.2025 18:30",
    {
        datetime: "medium"
    }
);

Локализованные разделители

Разные локали используют различные символы:

Локаль Пример
ru 18:20
en 6:20 PM
fr 18:20
ja 18:20

Globalize автоматически учитывает правила региона.


Ошибки при парсинге

Неверный формат

Globalize.parseDate("99:99", {
    skeleton: "Hm"
});

Результат:

null

Отсутствие CLDR-данных

E_MISSING_CLDR

Причина — не загружены данные локали.


Несовпадение локали

Globalize.locale("en");

Globalize.parseDate("23:10", {
    skeleton: "hma"
});

Формат ожидает AM/PM, поэтому разбор завершится ошибкой.


Валидация времени

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

function validateTime(value) {
    return Globalize.parseDate(value, {
        skeleton: "Hm"
    }) !== null;
}

Интеграция с HTML-формами

const input = document.querySelector("#time");

input.addEventListener("change", () => {
    const parsed = Globalize.parseDate(input.value, {
        skeleton: "Hm"
    });

    if (!parsed) {
        input.classList.add("error");
    }
});

Парсинг временных диапазонов

Globalize не разбирает диапазоны автоматически.

Строку необходимо разделять вручную:

const [start, end] = "09:00 - 18:00".split(" - ");

const startTime = Globalize.parseDate(start, {
    skeleton: "Hm"
});

const endTime = Globalize.parseDate(end, {
    skeleton: "Hm"
});

Сравнение с Date.parse

Date.parse

Date.parse("10:20")

Недостатки:

  • зависимость от браузера;
  • отсутствие локализации;
  • нестабильность поведения.

Globalize

Globalize.parseDate("10:20", {
    skeleton: "Hm"
});

Преимущества:

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

Парсинг в серверных приложениях Node.js

const Globalize = require("globalize");

const parser = Globalize.dateParser({
    skeleton: "Hms"
});

const result = parser("21:44:03");

Globalize одинаково работает как в браузере, так и в Node.js.


Кэширование парсеров

Повторное создание обработчиков может влиять на производительность.

Эффективный подход:

const parsers = {
    shortTime: Globalize.dateParser({
        skeleton: "Hm"
    }),

    fullTime: Globalize.dateParser({
        skeleton: "Hms"
    })
};

Использование:

const result = parsers.shortTime("11:20");

Практический пример

Globalize.locale("ru");

const parser = Globalize.dateParser({
    skeleton: "Hms"
});

const input = "16:25:44";

const result = parser(input);

if (result) {
    console.log("Часы:", result.getHours());
    console.log("Минуты:", result.getMinutes());
    console.log("Секунды:", result.getSeconds());
}

Поддержка Unicode и национальных форматов

Globalize способен работать с локализованными обозначениями времени благодаря данным Unicode CLDR. Это особенно важно для:

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

Архитектура парсинга в Globalize

Процесс разбора состоит из нескольких этапов:

  1. Определение текущей локали.
  2. Загрузка CLDR-шаблонов.
  3. Построение регулярного выражения.
  4. Разбор строки.
  5. Проверка диапазонов значений.
  6. Создание объекта Date.

Такой подход обеспечивает единое поведение во всех средах выполнения JavaScript.