Библиотека js-joda предоставляет мощную реализацию API
даты и времени, вдохновлённую Java Time API (java.time).
Базовая часть библиотеки ориентирована на точную работу с датами,
временем, часовыми поясами и временными интервалами, однако практически
не содержит средств локализации.
Пакет js-joda-locale добавляет:
Intl;Без js-joda-locale форматирование ограничивается
шаблонами и англоязычными значениями. После подключения пакета
становятся доступны полноценные механизмы интернационализации.
npm install @js-joda/core
npm install @js-joda/locale
Для работы с часовыми поясами дополнительно используется:
npm install @js-joda/timezone
const { LocalDate, DateTimeFormatter } = require('@js-joda/core');
require('@js-joda/locale_ru');
import { LocalDate, DateTimeFormatter } from '@js-joda/core';
import '@js-joda/locale_ru';
Система локализации в js-joda построена вокруг:
LocaleDateTimeFormatterDecimalStyleTextStyleResolverStyleОсновной объект — DateTimeFormatter, который умеет:
Каждая локаль подключается отдельным модулем.
import '@js-joda/locale_ru';
import '@js-joda/locale_de';
import '@js-joda/locale_fr';
Такой подход уменьшает размер итогового бандла.
import { Locale } from '@js-joda/locale';
const locale = Locale.forLanguageTag('ru');
const locale = Locale.forLanguageTag('en-US');
const locale = Locale.forLanguageTag('de-DE');
import {
LocalDate,
DateTimeFormatter
} from '@js-joda/core';
import { Locale } from '@js-joda/locale';
import '@js-joda/locale_ru';
const date = LocalDate.of(2025, 3, 18);
const formatter = DateTimeFormatter
.ofPattern('d MMMM yyyy')
.withLocale(Locale.forLanguageTag('ru'));
console.log(date.format(formatter));
Результат:
18 марта 2025
const formatter = DateTimeFormatter
.ofPattern('EEEE')
.withLocale(Locale.forLanguageTag('ru'));
console.log(date.format(formatter));
Результат:
вторник
const formatter = DateTimeFormatter
.ofPattern('EEE')
.withLocale(Locale.forLanguageTag('ru'));
Результат:
вт
const formatter = DateTimeFormatter
.ofPattern('MMMM')
.withLocale(Locale.forLanguageTag('ru'));
Результат:
март
const formatter = DateTimeFormatter
.ofPattern('MMM')
.withLocale(Locale.forLanguageTag('ru'));
Результат:
мар.
| Шаблон | Описание | Пример |
|---|---|---|
d |
День месяца | 5 |
dd |
День с нулём | 05 |
M |
Номер месяца | 3 |
MM |
Месяц с нулём | 03 |
MMM |
Краткий месяц | мар. |
MMMM |
Полный месяц | марта |
yy |
Короткий год | 25 |
yyyy |
Полный год | 2025 |
E |
Краткий день недели | вт |
EEEE |
Полный день недели | вторник |
DateTimeFormatter.ofPattern('MMM')
Выводит краткое название:
мар.
DateTimeFormatter.ofPattern('MMMM')
Выводит полную форму:
марта
import {
LocalDateTime,
DateTimeFormatter
} from '@js-joda/core';
const dateTime = LocalDateTime.of(
2025,
7,
21,
14,
35
);
const formatter = DateTimeFormatter
.ofPattern('d MMMM yyyy HH:mm')
.withLocale(Locale.forLanguageTag('ru'));
console.log(dateTime.format(formatter));
Результат:
21 июля 2025 14:35
const ru = Locale.forLanguageTag('ru');
const en = Locale.forLanguageTag('en-US');
const fr = Locale.forLanguageTag('fr-FR');
18 марта 2025
March 18, 2025
18. März 2025
import { LocalTime } from '@js-joda/core';
const time = LocalTime.of(9, 45);
const formatter = DateTimeFormatter
.ofPattern('HH:mm')
.withLocale(Locale.forLanguageTag('ru'));
console.log(time.format(formatter));
const formatter = DateTimeFormatter
.ofPattern('hh:mm a')
.withLocale(Locale.forLanguageTag('en-US'));
Результат:
09:45 AM
const formatter = DateTimeFormatter
.ofPattern('HH:mm');
Результат:
21:45
FormatStyle позволяет использовать готовые региональные
шаблоны.
import {
DateTimeFormatter,
FormatStyle
} from '@js-joda/core';
const formatter = DateTimeFormatter
.ofLocalizedDate(FormatStyle.FULL)
.withLocale(Locale.forLanguageTag('ru'));
Результат:
вторник, 18 марта 2025 г.
DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG)
Пример:
18 марта 2025 г.
DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
Пример:
18 мар. 2025 г.
DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
Пример:
18.03.2025
const formatter = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.MEDIUM)
.withLocale(Locale.forLanguageTag('ru'));
import {
ZonedDateTime,
ZoneId
} from '@js-joda/core';
const zoned = ZonedDateTime.now(
ZoneId.of('Europe/Moscow')
);
const formatter = DateTimeFormatter
.ofPattern('dd MMMM yyyy HH:mm z')
.withLocale(Locale.forLanguageTag('ru'));
console.log(zoned.format(formatter));
'z'
Пример результата:
MSK
'O'
Пример:
GMT+3
TextStyle определяет формат текстового
представления.
TextStyle.SHORT
Пример:
пн
TextStyle.FULL
Пример:
понедельник
Внутри js-joda-locale активно используется API
Intl.
Это обеспечивает:
Полная поддержка доступна в современных версиях Node.js.
Поддерживаются:
При использовании старых браузеров может потребоваться полифилл
Intl.
Русская локаль имеет несколько грамматических особенностей.
18 марта
но:
март
Это зависит от шаблона форматирования.
DateTimeFormatter.ofPattern('LLLL')
Результат:
март
DateTimeFormatter.ofPattern('MMMM')
Результат:
марта
const formatter = DateTimeFormatter
.ofPattern('d MMMM yyyy')
.withLocale(Locale.forLanguageTag('ru'));
const date = LocalDate.parse(
'18 марта 2025',
formatter
);
console.log(date.toString());
import '@js-joda/locale_ru';
Без подключения локали форматирование может завершиться ошибкой или использовать английские значения.
Locale.forLanguageTag('russian')
Locale.forLanguageTag('ru')
| Язык | Тег |
|---|---|
| Русский | ru |
| Английский | en-US |
| Немецкий | de-DE |
| Французский | fr-FR |
| Испанский | es-ES |
| Китайский | zh-CN |
| Японский | ja-JP |
import {
LocalDateTime,
DateTimeFormatter
} from '@js-joda/core';
import { Locale } from '@js-joda/locale';
import '@js-joda/locale_ru';
import '@js-joda/locale_en';
const formatterRu = DateTimeFormatter
.ofPattern('d MMMM yyyy HH:mm')
.withLocale(Locale.forLanguageTag('ru'));
const formatterEn = DateTimeFormatter
.ofPattern('MMMM d, yyyy h:mm a')
.withLocale(Locale.forLanguageTag('en-US'));
const date = LocalDateTime.now();
console.log(date.format(formatterRu));
console.log(date.format(formatterEn));
Правильно:
import '@js-joda/locale_ru';
Нежелательно:
import '@js-joda/locale';
Подключение всех локалей значительно увеличивает размер сборки.
Все объекты js-joda неизменяемы.
const formatter1 = DateTimeFormatter.ofPattern('dd.MM.yyyy');
const formatter2 = formatter1.withLocale(
Locale.forLanguageTag('ru')
);
Исходный объект не изменяется.
const formatter = DateTimeFormatter
.ofPattern('d MMMM yyyy')
.withLocale(Locale.forLanguageTag('ru'));
date.format(formatter)
DateTimeFormatter.ofLocalizedDate(
FormatStyle.LONG
)
Предпочтительно:
ofLocalizedDate(FormatStyle.LONG)
вместо жёстко заданных строк:
ofPattern('dd.MM.yyyy')
Локализованные стили автоматически учитывают региональные стандарты.
Создание DateTimeFormatter — относительно дорогая
операция.
Рекомендуется переиспользовать экземпляры:
const formatter = DateTimeFormatter
.ofPattern('d MMMM yyyy')
.withLocale(Locale.forLanguageTag('ru'));
| Пакет | Назначение |
|---|---|
@js-joda/core |
Основное API |
@js-joda/locale |
Локализация |
@js-joda/timezone |
Часовые пояса |
@js-joda/locale_ru |
Русская локаль |
@js-joda/locale_de |
Немецкая локаль |
Локализованное форматирование поддерживают:
LocalDateLocalTimeLocalDateTimeOffsetDateTimeZonedDateTimeYearMonthMonthDayimport { YearMonth } from '@js-joda/core';
const ym = YearMonth.of(2025, 3);
const formatter = DateTimeFormatter
.ofPattern('LLLL yyyy')
.withLocale(Locale.forLanguageTag('ru'));
console.log(ym.format(formatter));
Результат:
март 2025
import { MonthDay } from '@js-joda/core';
const md = MonthDay.of(3, 18);
const formatter = DateTimeFormatter
.ofPattern('d MMMM')
.withLocale(Locale.forLanguageTag('ru'));
console.log(md.format(formatter));
Результат:
18 марта