До появления современной библиотеки js-joda работа с
датами в JavaScript традиционно строилась вокруг встроенного объекта
Date. Несмотря на широкое распространение, этот механизм
долгое время считался проблемным по нескольким причинам:
Объект Date хранит время как количество миллисекунд с
эпохи Unix, однако поверх этой модели разработчику приходится вручную
контролировать:
Типичный код часто выглядел перегруженным:
const date = new Date();
date.setDate(date.getDate() + 5);
Подобный подход создавал несколько архитектурных проблем:
Например, невозможно явно различить:
Все эти сценарии сводились к одному типу — Date.
Схожие трудности существовали и в экосистеме Java до выхода Java 8. Основными средствами работы со временем были:
java.util.Datejava.util.Calendarjava.text.SimpleDateFormatЭти классы также обладали существенными недостатками:
| Проблема | Описание |
|---|---|
| Изменяемость | Объекты могли неожиданно менять состояние |
| Потоконебезопасность | Особенно в SimpleDateFormat |
| Неудобочитаемость | API считался перегруженным |
| Смешение концепций | UTC, локальное время и календарные операции были плохо разделены |
| Ошибки при вычислениях | Особенно в работе с часовыми поясами |
Например:
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, 5);
Подобный код был сложен для сопровождения и тестирования.
Для решения этих проблем программист Стивен Коулборн создал
библиотеку Joda-Time.
Stephen Colebourne
Главные идеи библиотеки:
Joda-Time быстро стала стандартом де-факто в
Java-разработке.
Пример:
LocalDate date = LocalDate.now().plusDays(5);
Код стал:
Успех Joda-Time привёл к созданию официального стандарта
Java — JSR-310.
В рамках этой инициативы был разработан новый пакет:
java.time
Он появился в Java 8 и полностью изменил работу со временем в платформе.
Основные разработчики:
Новый API унаследовал лучшие идеи Joda-Time, но был
глубже интегрирован в язык и JVM.
Новый API строился вокруг нескольких фундаментальных принципов.
Все основные классы являются immutable-объектами.
LocalDate newDate = oldDate.plusDays(1);
Исходный объект не изменяется.
Преимущества:
Каждый тип отвечает только за свою задачу.
| Класс | Назначение |
|---|---|
LocalDate |
Дата без времени |
LocalTime |
Время без даты |
LocalDateTime |
Дата и время без зоны |
ZonedDateTime |
Дата и время с таймзоной |
Instant |
Точка времени UTC |
Duration |
Продолжительность |
Period |
Календарный период |
Такой подход существенно улучшил читаемость кода.
Большинство операций читаются как естественный язык.
date.plusDays(3).minusMonths(1)
Вместо скрытого поведения используются специализированные типы:
ZonedDateTime
OffsetDateTime
ZoneId
JavaScript долгое время не имел современного API времени уровня
java.time.
Проблемы были особенно заметны:
Сообщество создало множество библиотек:
| Библиотека | Особенности |
|---|---|
| Moment.js | Простота, но mutable API |
| date-fns | Функциональный подход |
| Luxon | Современный API |
| Day.js | Лёгкая альтернатива Moment |
| js-joda | Порт Java Time API |
Наиболее близкой к архитектуре java.time стала именно
js-joda.
Библиотека js-joda была создана как перенос концепций
Java Time API в JavaScript.
Главная цель проекта:
предоставить идентичную модель работы со временем, основанную на принципах
java.time.
Проект ориентировался на:
Date.Структура библиотеки практически повторяет Java API.
Примеры классов:
| js-joda | Аналог Java |
|---|---|
LocalDate |
java.time.LocalDate |
LocalTime |
java.time.LocalTime |
LocalDateTime |
java.time.LocalDateTime |
ZonedDateTime |
java.time.ZonedDateTime |
Instant |
java.time.Instant |
Duration |
java.time.Duration |
Это позволило:
Все объекты библиотеки неизменяемы.
const date1 = LocalDate.parse('2025-01-10');
const date2 = date1.plusDays(5);
date1 остаётся неизменным.
Внутри js-joda нет зависимости от типичного поведения
JavaScript Date.
Это особенно важно, поскольку стандартный Date:
js-joda стремится сделать все операции максимально
явными.
js-joda является не просто вдохновлённой библиотекой, а
фактически реализацией философии JSR-310 для JavaScript.
Основные концепции были перенесены почти напрямую:
| Концепция | Реализация |
|---|---|
| Immutable objects | Да |
| Fluent API | Да |
| Temporal model | Да |
| Time-zone support | Да |
| ISO-8601 | Да |
| Separate temporal types | Да |
Проект поддерживается сообществом разработчиков Java и JavaScript.
Особую роль сыграли:
Библиотека быстро получила распространение в проектах, где требовались:
На момент появления js-joda библиотека
Moment.js уже была чрезвычайно популярной.
Однако у Moment существовали фундаментальные архитектурные ограничения.
moment.add(1, 'day');
Объект изменяется напрямую.
Это создавало:
Moment представлял большинство временных сущностей через один универсальный объект.
В js-joda используется строгая модель:
LocalDate
LocalTime
Instant
ZonedDateTime
Moment.js был монолитным и плохо оптимизировался сборщиками.
js-joda проектировалась более модульной.
Одной из ключевых особенностей Java Time API и js-joda
стала глубокая интеграция со стандартом ISO-8601.
Пример:
2025-05-14
2025-05-14T10:15:30
2025-05-14T10:15:30Z
Большинство операций ориентировано именно на этот международный стандарт.
Это особенно важно:
С течением времени JavaScript-сообщество начало двигаться в сторону принципов, которые давно существовали в Java Time API.
Стали популярны идеи:
На этом фоне архитектура js-joda выглядела особенно
современной.
При разработке нового стандарта JavaScript Temporal
многие идеи совпали с подходом Java Time API.
Например:
| Temporal | js-joda |
|---|---|
PlainDate |
LocalDate |
PlainTime |
LocalTime |
Instant |
Instant |
ZonedDateTime |
ZonedDateTime |
Это не случайность: обе системы решают одинаковые фундаментальные проблемы.
Подход JSR-310 стал эталонным благодаря нескольким причинам.
Методы работают одинаково независимо от окружения.
Каждая временная сущность имеет собственный тип.
Immutable-модель снижает количество ошибок.
API подходит как для простых задач, так и для enterprise-систем.
Библиотека особенно востребована в системах, где время является частью критической бизнес-логики:
Причины популярности:
| Причина | Объяснение |
|---|---|
| Совместимость с Java | Одинаковая модель времени |
| Надёжность | Минимум скрытых преобразований |
| Точность | Корректные вычисления |
| Immutable API | Безопасность состояния |
| Чёткая типизация | Меньше логических ошибок |
js-joda стала важным этапом эволюции
JavaScript-экосистемы.
Библиотека показала, что работа со временем должна строиться вокруг:
Она фактически перенесла зрелую архитектурную философию Java в мир
JavaScript и подготовила почву для появления современного стандарта
Temporal.