Библиотека js-joda изначально построена вокруг строгой модели ISO-8601 и не включает локализацию «из коробки» в ядре. Локали подключаются отдельно через дополнительные пакеты и используются преимущественно на уровне форматирования и парсинга строковых представлений дат и времени.
Основной принцип архитектуры локалей заключается в разделении:
Такой подход позволяет уменьшить размер ядра и не навязывать региональные настройки тем, кому они не нужны.
Поддержка локалей реализуется через отдельные пакеты:
npm install @js-joda/core
npm install @js-joda/locale
npm install @js-joda/locale_en
Дополнительно могут подключаться другие языковые пакеты:
npm install @js-joda/locale_fr
npm install @js-joda/locale_de
npm install @js-joda/locale_ru
Каждый пакет локали содержит набор правил форматирования: названия месяцев, дней недели, форматы даты, правила отображения AM/PM и другие региональные особенности.
После установки необходимо импортировать как ядро, так и локальные данные:
import { LocalDate } from '@js-joda/core';
import { DateTimeFormatter } from '@js-joda/core';
import { Locale } from '@js-joda/locale';
import '@js-joda/locale_en';
Импорт пакета локали (@js-joda/locale_en) не возвращает
значение, но регистрирует данные внутри системы js-joda.
Локаль применяется через объект DateTimeFormatter.
import { LocalDate } from '@js-joda/core';
import { DateTimeFormatter } from '@js-joda/core';
import { Locale } from '@js-joda/locale';
import '@js-joda/locale_en';
const date = LocalDate.of(2026, 5, 25);
const formatter = DateTimeFormatter
.ofPattern('EEEE, d MMMM yyyy')
.withLocale(Locale.US);
console.log(date.format(formatter));
В этом примере локаль влияет на:
EEEE)MMMM)Один и тот же шаблон может давать разные результаты в зависимости от локали.
const formatter = DateTimeFormatter
.ofPattern('d MMMM yyyy')
.withLocale(Locale.US);
const formatterFR = DateTimeFormatter
.ofPattern('d MMMM yyyy')
.withLocale(Locale.FRANCE);
Результат:
May 25 202625 mai 2026Разница определяется не шаблоном, а локализованными данными.
Локали влияют на несколько уровней представления:
В реальных приложениях часто подключается несколько языков одновременно.
import '@js-joda/locale_en';
import '@js-joda/locale_fr';
import '@js-joda/locale_de';
Выбор локали выполняется динамически:
function formatDate(date, locale) {
return date.format(
DateTimeFormatter
.ofPattern('EEEE, d MMMM yyyy')
.withLocale(locale)
);
}
Объект Locale является ключевым элементом управления
локализацией.
import { Locale } from '@js-joda/locale';
const us = Locale.US;
const france = Locale.FRANCE;
Также возможно создание пользовательских локалей:
const custom = new Locale('ru', 'RU');
Однако полноценная поддержка зависит от того, загружены ли соответствующие данные локали.
Локаль влияет не только на форматирование, но и на обратную операцию — разбор строки.
const formatter = DateTimeFormatter
.ofPattern('d MMMM yyyy')
.withLocale(Locale.US);
const date = LocalDate.parse('25 May 2026', formatter);
Если локаль не соответствует входной строке, парсинг может завершиться ошибкой или неверным результатом.
Важная особенность js-joda: локаль никогда не влияет на внутреннее представление даты.
const date = LocalDate.of(2026, 5, 25);
Эта дата всегда:
Локаль влияет только на строковое представление, но не изменяет структуру данных.
Локаль и временные зоны — независимые механизмы:
import { ZonedDateTime, ZoneId } from '@js-joda/core';
import { Locale } from '@js-joda/locale';
const zdt = ZonedDateTime.now(ZoneId.of('Europe/Paris'));
const formatter = DateTimeFormatter
.ofPattern('EEEE, d MMMM yyyy HH:mm')
.withLocale(Locale.FRANCE);
console.log(zdt.format(formatter));
Если локаль не подключена или отсутствуют данные:
Это делает систему предсказуемой даже в минимальной конфигурации.
js-joda не заменяет Intl.DateTimeFormat, но может
использоваться совместно.
Различия:
При необходимости js-joda применяется как источник данных, а Intl — как слой отображения.
Шаблоны могут содержать буквенные сегменты:
DateTimeFormatter.ofPattern("'Дата:' d MMMM yyyy")
При использовании локали:
Локаль определяет, какие формы используются:
MMM — сокращённый месяцMMMM — полный месяцEEE — короткий день неделиEEEE — полный день неделиconst formatter = DateTimeFormatter
.ofPattern('EEEE, MMMM d')
.withLocale(Locale.US);
Система локалей js-joda имеет ряд принципиальных ограничений:
Эти ограничения являются частью архитектурной модели предсказуемости и минимализма.
Локали в js-joda выполняют строго ограниченную функцию: преобразование структурированных временных данных в человекочитаемые строки.
Ключевое свойство системы: