Парсинг строк в даты

Библиотека js-joda опирается на строгую модель работы с датами и временем, где основной формат обмена — ISO-8601. Именно поэтому базовый разбор строк в даты чаще всего выполняется без дополнительных настроек.

import { LocalDate, LocalDateTime, ZonedDateTime } from '@js-joda/core';

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

const date = LocalDate.parse('2026-05-24');
const dateTime = LocalDateTime.parse('2026-05-24T14:30:00');
const zoned = ZonedDateTime.parse('2026-05-24T14:30:00+06:00[Asia/Almaty]');

При корректном ISO-формате библиотека самостоятельно определяет структуру строки и преобразует её в соответствующий объект. Это поведение делает парсинг предсказуемым и исключает неоднозначность.


Парсинг LocalDate из строки

LocalDate работает только с календарной датой без времени и зоны. Формат строки должен строго соответствовать YYYY-MM-DD.

const d1 = LocalDate.parse('2026-01-15');
const d2 = LocalDate.parse('1999-12-31');

Любое отклонение от формата приводит к исключению:

LocalDate.parse('15-01-2026'); // ошибка

В js-joda нет неявных преобразований, поэтому даже частично корректные строки не интерпретируются.


Парсинг LocalDateTime

LocalDateTime расширяет модель даты, добавляя время, но без часового пояса. Поддерживается стандартный ISO-формат с разделителем T.

const dt = LocalDateTime.parse('2026-05-24T10:15:30');

Поддерживаются также доли секунды:

const dt = LocalDateTime.parse('2026-05-24T10:15:30.123');

Строка должна включать дату и время одновременно. Отсутствие одной из частей делает строку невалидной:

LocalDateTime.parse('2026-05-24'); // ошибка

ZonedDateTime и работа с часовыми поясами

ZonedDateTime требует максимально полной информации: дата, время, смещение и идентификатор зоны.

const zdt = ZonedDateTime.parse('2026-05-24T10:15:30+06:00[Asia/Almaty]');

Структура строки включает три компонента:

  • локальная дата и время
  • смещение относительно UTC
  • региональный идентификатор зоны

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

Неполные строки не разбираются:

ZonedDateTime.parse('2026-05-24T10:15:30'); // ошибка

Использование DateTimeFormatter для нестандартных форматов

Когда входные строки не соответствуют ISO-8601, применяется DateTimeFormatter. Он позволяет описывать произвольные шаблоны.

import { DateTimeFormatter } from '@js-joda/core';

Пример форматтера для даты в формате dd.MM.yyyy:

const formatter = DateTimeFormatter.ofPattern('dd.MM.yyyy');

const date = LocalDate.parse('24.05.2026', formatter);

Форматтер становится обязательным аргументом, если строка отклоняется от ISO-стандарта.


Разбор строки с временем и кастомным форматом

const formatter = DateTimeFormatter.ofPattern('dd.MM.yyyy HH:mm');

const dt = LocalDateTime.parse('24.05.2026 18:45', formatter);

Шаблон строго соответствует входной строке. Любое расхождение в порядке или символах приводит к ошибке парсинга.


Символы шаблонов DateTimeFormatter

Наиболее часто используемые элементы:

  • yyyy — год
  • MM — месяц
  • dd — день
  • HH — часы (24-часовой формат)
  • mm — минуты
  • ss — секунды

Пример комбинированного шаблона:

const formatter = DateTimeFormatter.ofPattern('yyyy/MM/dd HH:mm:ss');
const dt = LocalDateTime.parse('2026/05/24 14:30:00', formatter);

Строгий и мягкий разбор (ResolverStyle)

js-joda поддерживает настройку стратегии разбора через ResolverStyle. Это влияет на поведение при неоднозначных или частично некорректных данных.

import { ResolverStyle } from '@js-joda/core';

Три режима:

  • STRICT — строгая проверка всех значений
  • SMART — допускает логические корректировки
  • LENIENT — максимально гибкий режим

Пример строгого форматтера:

const formatter = DateTimeFormatter
  .ofPattern('dd.MM.yyyy')
  .withResolverStyle(ResolverStyle.STRICT);

В строгом режиме дата 31.02.2026 будет отклонена, даже если логика допускает «перенос» на март.


Парсинг дат с часовыми смещениями

Строки с UTC-смещением обрабатываются через OffsetDateTime или ZonedDateTime.

import { OffsetDateTime } from '@js-joda/core';

const odt = OffsetDateTime.parse('2026-05-24T10:15:30+06:00');

Здесь не требуется идентификатор зоны, достаточно смещения. Однако такая модель не хранит информацию о регионе.


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

При некорректной строке js-joda выбрасывает исключение DateTimeParseException.

try {
  const date = LocalDate.parse('2026/05/24');
} catch (e) {
  // обработка ошибки
}

Ошибка содержит позицию, на которой произошёл сбой, что помогает диагностировать проблему в формате входных данных.


Автоматическое определение компонентов строки

ISO-парсинг поддерживает разные уровни детализации:

LocalDate.parse('2026-05-24');
LocalDateTime.parse('2026-05-24T14:30');
ZonedDateTime.parse('2026-05-24T14:30+06:00[Asia/Almaty]');

Чем больше информации содержится в строке, тем более специализированный тип выбирается для результата.


Использование парсинга в цепочках преобразований

Результат парсинга часто становится входом для дальнейших операций:

const date = LocalDate.parse('2026-05-24');
const nextWeek = date.plusWeeks(1);

При этом сам процесс парсинга остаётся неизменным — строка всегда интерпретируется в неизменяемый объект даты.


Нюансы локализации и пользовательских форматов

js-joda не использует локаль браузера для автоматического разбора строк. Любой нестандартный формат требует явного описания через DateTimeFormatter.

const formatter = DateTimeFormatter.ofPattern('dd-MM-yyyy');
const date = LocalDate.parse('24-05-2026', formatter);

Такой подход исключает неоднозначность, характерную для локализованных форматов вроде 05/06/2026, где невозможно однозначно определить порядок месяца и дня без контекста.


Разбор частичных дат

Некоторые строки содержат только часть информации. js-joda не заполняет пропущенные значения автоматически:

LocalDate.parse('2026-05'); // ошибка

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


Работа с дробными секундами и точностью

При наличии долей секунды точность сохраняется в объекте времени:

const dt = LocalDateTime.parse('2026-05-24T10:15:30.456789');

js-joda поддерживает высокую точность, не округляя значение автоматически.


Комбинирование парсинга и форматирования

Один и тот же DateTimeFormatter используется как для разбора строк, так и для их формирования.

const formatter = DateTimeFormatter.ofPattern('dd.MM.yyyy HH:mm');

const dt = LocalDateTime.parse('24.05.2026 18:45', formatter);
const str = dt.format(formatter);

Такая симметрия обеспечивает консистентность представления данных при сериализации и десериализации.