DateTimeFormatter в js-jodaВ js-joda форматирование и разбор строковых
представлений дат и времени выполняется через неизменяемый объект
DateTimeFormatter. Его ключевая характеристика —
иммутабельность: любой вызов методов конфигурации
возвращает новый экземпляр форматтера, не изменяя исходный.
Такой подход делает форматтеры безопасными для повторного использования и исключает необходимость их пересоздания в каждом месте кода.
Создание форматтера через
DateTimeFormatter.ofPattern(...), ISO_DATE,
BASIC_ISO_DATE и другие фабричные методы включает:
Эти операции выполняются один раз при создании экземпляра, но становятся заметными при частом вызове, особенно:
Поскольку DateTimeFormatter неизменяем, один и тот же
экземпляр можно безопасно использовать:
Это свойство делает его идеальным кандидатом для вынесения в константы уровня модуля.
Наиболее распространённая стратегия — создание форматтеров на уровне модуля и экспорт их как констант.
import { DateTimeFormatter } from '@js-joda/core';
export const DATE_FORMAT = DateTimeFormatter.ofPattern('yyyy-MM-dd');
export const DATETIME_FORMAT = DateTimeFormatter.ofPattern('yyyy-MM-dd HH:mm:ss');
export const TIME_FORMAT = DateTimeFormatter.ofPattern('HH:mm');
Такой подход гарантирует:
Использование заранее созданного форматтера снижает нагрузку на выполнение:
import { LocalDate } from '@js-joda/core';
import { DATE_FORMAT } from './formatters.js';
function formatDate(date) {
return date.format(DATE_FORMAT);
}
const result = formatDate(LocalDate.now());
Создание форматтера внутри функции в этом случае является анти-паттерном:
// нежелательно
function formatDate(date) {
const fmt = DateTimeFormatter.ofPattern('yyyy-MM-dd');
return date.format(fmt);
}
Форматтер используется не только для вывода, но и для разбора строк:
const DATE_FORMAT = DateTimeFormatter.ofPattern('yyyy-MM-dd');
const date = LocalDate.parse('2026-01-25', DATE_FORMAT);
Повторное создание форматтера при парсинге приводит к лишним затратам CPU и памяти, особенно при обработке больших массивов данных.
В системах, где шаблоны формируются динамически, применяется кэширование.
import { DateTimeFormatter } from '@js-joda/core';
const formatterCache = new Map();
export function getFormatter(pattern) {
if (!formatterCache.has(pattern)) {
formatterCache.set(pattern, DateTimeFormatter.ofPattern(pattern));
}
return formatterCache.get(pattern);
}
Такой подход полезен при:
При использовании локализации форматтер зависит не только от шаблона, но и от локали:
const cache = new Map();
function getFormatter(pattern, locale) {
const key = `${pattern}::${locale}`;
if (!cache.has(key)) {
cache.set(key, DateTimeFormatter.ofPattern(pattern).withLocale(locale));
}
return cache.get(key);
}
Это особенно важно при работе с:
for (const item of items) {
const fmt = DateTimeFormatter.ofPattern('yyyy-MM-dd');
console.log(item.date.format(fmt));
}
Проблема заключается в повторном построении одного и того же объекта на каждой итерации.
function format(date, pattern) {
return date.format(DateTimeFormatter.ofPattern(pattern));
}
При высокой частоте вызовов это приводит к:
js-joda позволяет комбинировать форматтеры через методы
appendPattern, withLocale,
withResolverStyle. Каждый такой вызов создаёт новый объект,
поэтому важно сохранять промежуточные результаты.
const base = DateTimeFormatter.ofPattern('yyyy-MM-dd');
const extended = base.withLocale(Locale.US);
При этом base остаётся валидным и может использоваться в
других частях системы.
В архитектурно устойчивых системах форматтеры выделяются в отдельный слой:
formatters.js или
date-formatters.js;Такое разделение уменьшает связность и упрощает поддержку единых стандартов отображения дат.
При обработке больших массивов дат различие между созданием форматтера на каждый вызов и его переиспользованием становится значительным.
Основные эффекты переиспользования:
Переиспользование форматтеров формирует основу стабильного слоя
работы с датами в js-joda. Оно снижает стоимость операций
форматирования и делает поведение системы предсказуемым при росте
нагрузки, особенно в сценариях массового преобразования временных данных
и сериализации.