В библиотеке js-joda форматирование дат и времени реализуется через
объект DateTimeFormatter. Он выполняет две ключевые задачи:
преобразование объектов даты/времени в строку и обратное преобразование
строки в объект временной шкалы. В отличие от стандартного
Date в JavaScript, js-joda опирается на неизменяемые
(immutable) типы и строгую модель времени, где форматирование отделено
от самих данных.
Форматтеры создаются либо через предопределённые константы, либо через описание шаблона, либо через построитель.
Базовое использование:
import { LocalDate, DateTimeFormatter } from '@js-joda/core';
const date = LocalDate.of(2026, 1, 24);
const formatter = DateTimeFormatter.ofPattern('dd-MM-yyyy');
const result = date.format(formatter);
Результатом будет строка вида:
24-01-2026
Форматтер не изменяет исходный объект, а лишь описывает правила преобразования.
Шаблон форматирования задаётся строкой, где каждый символ имеет специальное значение. Основные элементы паттернов:
y — годM — месяцd — день месяцаH — часы (0–23)m — минутыs — секундыКоличество повторов символа влияет на формат вывода:
DateTimeFormatter.ofPattern('yyyy-MM-dd');
DateTimeFormatter.ofPattern('yy-M-d');
Первый вариант даёт фиксированную ширину:
2026-01-24
Второй — сокращённый:
26-1-24
Важно учитывать, что js-joda строго интерпретирует символы, поэтому ошибки в шаблоне приводят к исключениям, а не к неявному поведению.
Каждый тип времени поддерживает собственный набор доступных полей.
LocalDate работает только с датой, LocalTime —
только со временем, а LocalDateTime объединяет оба
представления.
import { LocalDate, DateTimeFormatter } from '@js-joda/core';
const date = LocalDate.of(2026, 5, 24);
const formatter = DateTimeFormatter.ofPattern('dd MMMM yyyy');
date.format(formatter);
Результат зависит от локали и может выглядеть как:
24 May 2026
import { LocalTime, DateTimeFormatter } from '@js-joda/core';
const time = LocalTime.of(14, 35, 50);
const formatter = DateTimeFormatter.ofPattern('HH:mm:ss');
time.format(formatter);
Результат:
14:35:50
import { LocalDateTime, DateTimeFormatter } from '@js-joda/core';
const dt = LocalDateTime.of(2026, 5, 24, 14, 35);
const formatter = DateTimeFormatter.ofPattern('yyyy-MM-dd HH:mm');
dt.format(formatter);
Результат:
2026-05-24 14:35
ZonedDateTime добавляет контекст временной зоны, что
влияет как на вычисления, так и на форматирование.
import { ZonedDateTime, DateTimeFormatter, ZoneId } from '@js-joda/core';
const zdt = ZonedDateTime.now(ZoneId.of('Europe/Paris'));
const formatter = DateTimeFormatter.ofPattern('yyyy-MM-dd HH:mm z');
zdt.format(formatter);
Здесь символ z отвечает за отображение краткого
обозначения временной зоны.
Расширенные символы:
Z — смещение от UTC (+0100)z — текстовое имя зоныO — сокращённый формат смещенияПример:
2026-05-24 14:35 CET
Работа с зонами требует внимательности: форматирование отображает уже
преобразованное локальное время, зависящее от ZoneId.
Форматирование может учитывать региональные настройки через
Locale. Это влияет на отображение месяцев, дней недели и
структуры даты.
import { LocalDate, DateTimeFormatter, Locale } from '@js-joda/core';
const date = LocalDate.of(2026, 5, 24);
const formatter = DateTimeFormatter
.ofPattern('d MMMM yyyy')
.withLocale(Locale.FRANCE);
date.format(formatter);
Результат:
24 mai 2026
Локализация особенно важна при использовании словесных форм месяцев и
дней недели. Без явного Locale поведение может зависеть от
окружения.
Система паттернов js-joda основана на строгой спецификации, близкой к
Java DateTimeFormatter.
Основные группы символов:
y — годM — месяцd — деньH — часы 24hh — часы 12hm, s — минуты и секундыM (MMMM) — полное название месяцаE — день неделиa — AM/PMZ — +0000X — +00:00z — Europe/ParisЛюбой текст, не являющийся символом форматирования, должен быть заключён в одинарные кавычки:
DateTimeFormatter.ofPattern("'Дата:' dd.MM.yyyy");
Результат:
Дата: 24.05.2026
Если кавычки не использовать, парсер воспримет символы как управляющие.
js-joda содержит набор стандартных форматтеров, оптимизированных для ISO и универсальных представлений.
Основные:
DateTimeFormatter.ISO_LOCAL_DATEDateTimeFormatter.ISO_LOCAL_TIMEDateTimeFormatter.ISO_LOCAL_DATE_TIMEDateTimeFormatter.ISO_ZONED_DATE_TIMEПример:
import { LocalDate, DateTimeFormatter } from '@js-joda/core';
const date = LocalDate.of(2026, 5, 24);
date.format(DateTimeFormatter.ISO_LOCAL_DATE);
Результат:
2026-05-24
Эти форматтеры обеспечивают совместимость с внешними системами и API.
Форматтер используется не только для вывода, но и для парсинга строк:
import { LocalDate, DateTimeFormatter } from '@js-joda/core';
const formatter = DateTimeFormatter.ofPattern('dd.MM.yyyy');
const date = LocalDate.parse('24.05.2026', formatter);
Парсинг строго соответствует шаблону. Любое отклонение формата приводит к ошибке.
Особенности:
Форматтеры можно комбинировать и настраивать через цепочки вызовов:
const formatter = DateTimeFormatter
.ofPattern('dd MMM yyyy')
.withLocale(Locale.ENGLISH);
Также возможно использование билдера:
DateTimeFormatter.ofPattern('dd/MM/yyyy HH:mm')
В более сложных сценариях форматтеры строятся программно, особенно при необходимости динамической локализации.
Объекты DateTimeFormatter являются immutable и
потокобезопасными. Это означает:
const formatter = DateTimeFormatter.ofPattern('yyyy-MM-dd');
const a = date1.format(formatter);
const b = date2.format(formatter);
Такой подход снижает накладные расходы при массовом форматировании.
Часто встречаются следующие проблемы:
mm вместо
MM для месяцев)h и
H)Например:
DateTimeFormatter.ofPattern('mm-dd-yyyy'); // mm — минуты, а не месяц
Такой шаблон приводит к некорректному результату, поскольку
mm обозначает минуты, а не месяц.