Библиотека js-joda реализует строгую модель работы с датами и временем, заимствованную из Java Time API. Ключевой принцип заключается в том, что большинство операций с некорректными входными данными не приводят к «мягким» результатам или автоматическим исправлениям — вместо этого возбуждаются исключения. Это позволяет избегать скрытых ошибок и неоднозначных состояний времени.
Основные источники невалидных значений:
"2024-02-30",
"not-a-date")Instant)null или undefinedБазовое исключение для всех ошибок, связанных с датой и временем. В js-joda оно используется как универсальный сигнал о том, что операция невозможна из-за некорректного состояния данных.
Типичные ситуации:
Пример:
LocalDate.of(2023, 2, 30); // ошибка
Февраль не содержит 30 дней, поэтому выбрасывается исключение.
Возникает при неудачном разборе строки даты или времени.
LocalDate.parse("2023-13-01");
Месяц 13 выходит за допустимый диапазон, поэтому парсер прерывает выполнение.
Особенность: ошибка возникает до создания объекта, на этапе синтаксического анализа строки.
В js-joda используется для строгого контроля входных параметров.
Любое значение null или undefined, переданное
туда, где ожидается объект времени или числовой параметр, приводит к
исключению.
LocalDate.of(null, 1, 10);
Даже если логически можно было бы «подставить текущее значение», библиотека этого не делает.
Возникает при переполнении или выходе числовых операций за допустимые
границы, особенно при работе с Instant,
Duration, Period.
Instant.ofEpochSecond(Number.MAX_SAFE_INTEGER * 10);
Если значение выходит за диапазон представимого времени, операция прерывается.
JavaScript-специфика добавляет отдельный класс проблем, нехарактерных для Java:
undefined часто появляется при деструктуризацииnull передаётся как результат отсутствующих данных из
APIjs-joda не выполняет автоматическое приведение типов, поэтому любое «пустое» значение считается ошибкой.
LocalDate.of(undefined, 5, 10); // NullPointerException
Ключевой принцип: отсутствие значения не интерпретируется как «сегодня» или «минимальная дата».
Парсер ожидает строго определённые ISO-форматы:
YYYY-MM-DD для LocalDateYYYY-MM-DDTHH:mm для LocalDateTimeYYYY-MM-DDTHH:mm:ssZ для InstantЛюбое отклонение приводит к исключению.
LocalDate.parse("01-2024-12"); // DateTimeParseException
Даже при формально правильной структуре строка может быть невалидной:
LocalDate.parse("2024-02-30");
Парсер не выполняет «исправление» даты на 28 или 29 февраля — операция считается ошибочной.
js-joda использует календарь, где каждая дата должна существовать в реальном григорианском календаре.
Невозможные комбинации:
LocalDate.of(2023, 2, 29); // ошибка
В отличие от некоторых библиотек, здесь нет автоматического округления дат.
ZoneId.of("Mars/Phobos");
Любая строка, не входящая в список IANA time zone database, вызывает исключение.
Типичная ошибка:
"Europe/Moskow")Библиотека не предоставляет автоматического fallback. Поэтому любая ошибка зоны должна обрабатываться явно.
Instant опирается на эпоху Unix и имеет жесткие
границы:
Ошибки возникают при:
NumberInstant.ofEpochMilli("abc"); // DateTimeException
JavaScript использует Number с ограниченной точностью,
поэтому js-joda защищает операции от некорректных результатов:
DurationПри выходе за пределы:
Duration.ofDays(1e15);
возникает исключение, предотвращающее создание бессмысленного объекта времени.
Некоторые временные типы не поддерживают все поля:
LocalDate не содержит часовInstant не поддерживает месяцыYearMonth не имеет дняПопытка доступа к неподдерживаемому полю:
localDate.get(ChronoField.HOUR_OF_DAY);
вызывает ошибку DateTimeException.
Перед созданием объектов времени выполняется проверка:
function safeLocalDate(year, month, day) {
if (
typeof year !== "number" ||
typeof month !== "number" ||
typeof day !== "number"
) {
return null;
}
try {
return LocalDate.of(year, month, day);
} catch (e) {
return null;
}
}
function safeParseDate(str) {
try {
return LocalDate.parse(str);
} catch (e) {
return null;
}
}
Такая модель используется при работе с внешними API, где данные не гарантированно корректны.
Практика обработки невалидных значений строится по уровням:
При использовании DateTimeFormatter ошибки могут
возникать на нескольких этапах:
DateTimeFormatter.ofPattern("dd-MM-yyyy").parse("2024/12/01");
Здесь ошибка возникает из-за несовпадения разделителей.
Некоторые операции могут приводить к ошибкам не сразу, а на этапе вычисления:
localDate.plusMonths(1).plusDays(31);
Если промежуточное значение становится невалидным, операция прерывается.
function toInstant(value) {
try {
return Instant.parse(value);
} catch {
return null;
}
}
Перед передачей в js-joda значения приводятся к:
Все данные, приходящие извне (API, пользовательский ввод, база данных), считаются потенциально невалидными до проверки.
Работа js-joda усиливает необходимость строгого контроля входных данных, поскольку библиотека не допускает неявных исправлений и всегда сигнализирует об ошибке через исключения.