В библиотеке js-joda ошибки, связанные с работой даты и времени,
централизованы вокруг базового типа DateTimeException. Он
используется как корневой класс для большинства ошибок, возникающих при
парсинге, преобразованиях, вычислениях и работе с календарными
системами. Такая структура повторяет подход Java Time API, на котором
основана библиотека.
Иерархия упрощённо выглядит так:
DateTimeException
DateTimeParseExceptionZoneRulesExceptionUnsupportedTemporalTypeException (в отдельных
реализациях/портированных частях API)отдельные runtime-исключения, связанные с переполнением
(например, ArithmeticException)
DateTimeException является корневым классом для всех
специфичных ошибок временной модели. Он представляет собой
unchecked-исключение, что означает отсутствие обязательной обработки
через try/catch, хотя в прикладном коде обработка часто
необходима.
Основные сценарии возникновения:
Пример возникновения базовой ошибки:
import { LocalDate } from '@js-joda/core';
const date = LocalDate.of(2024, 2, 30);
В данном случае попытка создать 30 февраля приводит к выбросу
DateTimeException, так как дата не существует в
григорианском календаре.
Особенность временной модели заключается в строгой валидации каждого компонента:
Любое отклонение от допустимых значений приводит к исключению.
Пример:
import { LocalTime } from '@js-joda/core';
const time = LocalTime.of(25, 10);
Здесь значение часа выходит за пределы диапазона 0–23, что приводит к
DateTimeException.
Одним из наиболее частых наследников DateTimeException
является DateTimeParseException. Оно возникает при попытке
преобразовать строку в объект даты/времени, если формат не соответствует
ожидаемому шаблону.
import { LocalDate } from '@js-joda/core';
const date = LocalDate.parse('2024-13-10');
Месяц 13 не существует, поэтому парсер выбрасывает
DateTimeParseException.
DateTimeParseException обычно содержит:
Это делает его более информативным по сравнению с базовым
DateTimeException.
import { DateTimeFormatter, LocalDate } from '@js-joda/core';
const formatter = DateTimeFormatter.ofPattern('yyyy/MM/dd');
const date = LocalDate.parse('2024-02-30', formatter);
Здесь ошибка возникает не из-за формата, а из-за несуществующей даты, но тип исключения остаётся тем же.
ZoneRulesException возникает при работе с временными
зонами, когда система не может корректно разрешить правила часового
пояса.
import { ZoneId } from '@js-joda/core';
const zone = ZoneId.of('Mars/Phobos');
Такой идентификатор не существует в базе временных зон, что приводит
к ZoneRulesException.
Ошибки зон часто связаны не с кодом, а с окружением:
Это исключение возникает при попытке использовать временное поле или операцию, которая не поддерживается конкретным типом даты/времени.
import { LocalDate } from '@js-joda/core';
const date = LocalDate.now();
date.getHour();
LocalDate не содержит информации о времени суток,
поэтому доступ к getHour() приводит к
UnsupportedTemporalTypeException.
Каждый временной тип в js-joda реализует ограниченный набор полей:
LocalDate — только датаLocalTime — только времяLocalDateTime — дата и времяZonedDateTime — дата, время и зонаПопытка выйти за рамки модели приводит к исключению.
Хотя ArithmeticException не является прямым наследником
DateTimeException, он тесно связан с временными
вычислениями.
import { LocalDate } from '@js-joda/core';
const date = LocalDate.of(999999999, 1, 1);
const result = date.plusYears(1);
Если результат выходит за пределы допустимого диапазона, возникает
ArithmeticException.
Любой метод создания или преобразования проверяет корректность аргументов:
Все объекты js-joda неизменяемы. Это приводит к тому, что:
В отличие от Date в JavaScript, js-joda не
допускает:
Частый источник исключений — преобразования между временными сущностями:
LocalDate → ZonedDateTimeInstant → LocalDate без зоныПример:
import { Instant, LocalDate } from '@js-joda/core';
const instant = Instant.now();
const date = LocalDate.from(instant);
Такое преобразование требует контекста временной зоны. При его
отсутствии возникает DateTimeException.
В цепочках вызовов ошибка может возникнуть на любом этапе:
import { LocalDate } from '@js-joda/core';
const result = LocalDate.of(2024, 2, 28)
.plusDays(1)
.plusMonths(1)
.withDayOfMonth(31);
Если конечная операция приводит к несуществующей дате (например, 31
марта → 31 апреля), выбрасывается DateTimeException.
При анализе ошибок временной модели важны:
Особенно важно учитывать, что js-joda не скрывает ошибки через автокоррекцию, а фиксирует их строго через исключения.
Парсинг и форматирование используют единый механизм:
DateTimeParseExceptionПример строгого форматирования:
import { DateTimeFormatter, LocalDate } from '@js-joda/core';
const formatter = DateTimeFormatter.ofPattern('dd-MM-yyyy');
LocalDate.parse('31-02-2024', formatter);
Ошибка возникает на этапе валидации календаря, а не синтаксиса строки.