В библиотеке Js-joda создание объектов временных
типов построено вокруг набора статических фабричных методов.
Конструкторы напрямую не используются: все экземпляры
LocalDate, LocalTime, Instant,
ZonedDateTime и других типов создаются через строго
определённые точки входа. Такой подход обеспечивает неизменяемость,
консистентность и контроль над внутренними представлениями даты и
времени.
Фабричные методы в Js-joda выполняют роль централизованного механизма создания объектов. Они заменяют конструкторы и позволяют:
Каждый класс временного API предоставляет собственный набор статических методов, которые можно условно разделить на несколько категорий: создание «с нуля», создание из компонентов, создание из строк и создание на основе текущего времени.
Одним из ключевых наборов фабричных методов являются методы, возвращающие текущий момент времени.
now()Метод now() присутствует во всех основных временных
типах:
LocalDate.now()LocalTime.now()LocalDateTime.now()ZonedDateTime.now()Instant.now()Он возвращает текущее значение в зависимости от типа:
import { LocalDate, LocalTime, ZonedDateTime } from '@js-joda/core';
const date = LocalDate.now();
const time = LocalTime.now();
const dateTime = ZonedDateTime.now();
Особенность заключается в том, что now() учитывает
системное время и, при необходимости, переданную временную зону:
import { ZoneId, ZonedDateTime } from '@js-joda/core';
const zone = ZoneId.of('Europe/Moscow');
const zoned = ZonedDateTime.now(zone);
Фабричный метод скрывает работу с системными часами и обеспечивает согласованность получения времени.
Для большинства типов Js-joda предусмотрены методы of(),
которые позволяют явно задать все компоненты значения.
LocalDate.of(year, month, day)Создаёт дату из трёх числовых параметров:
import { LocalDate } from '@js-joda/core';
const date = LocalDate.of(2025, 5, 10);
Параметры строго валидируются. Неверные значения (например, 31 февраля) приводят к ошибке.
Также допускается использование перечисления месяцев:
import { LocalDate, Month } from '@js-joda/core';
const date = LocalDate.of(2025, Month.MAY, 10);
LocalTime.of(hour, minute, second?, nano?)Создание времени с точностью до наносекунд:
import { LocalTime } from '@js-joda/core';
const time = LocalTime.of(14, 30);
const precise = LocalTime.of(14, 30, 15, 123000000);
Если необязательные параметры не переданы, они принимают значение 0.
Валидация диапазонов жёсткая:
LocalDateTime.of(...)Комбинированное создание даты и времени:
import { LocalDateTime } from '@js-joda/core';
const dt = LocalDateTime.of(2025, 5, 10, 14, 30);
Также поддерживаются расширенные формы:
const dt = LocalDateTime.of(2025, 5, 10, 14, 30, 15);
const dtFull = LocalDateTime.of(2025, 5, 10, 14, 30, 15, 123000000);
ZonedDateTime.of(...)Создание временной метки с зоной:
import { ZonedDateTime, ZoneId } from '@js-joda/core';
const zone = ZoneId.of('Asia/Tokyo');
const zdt = ZonedDateTime.of(2025, 5, 10, 14, 30, 0, 0, zone);
Этот метод объединяет локальные компоненты с информацией о временной зоне, формируя абсолютный момент времени.
Instant.ofEpochSecond()
и Instant.ofEpochMilli()Тип Instant представляет момент времени в UTC. Фабричные
методы позволяют создавать его из эпохи Unix:
import { Instant } from '@js-joda/core';
const i1 = Instant.ofEpochSecond(1_700_000_000);
const i2 = Instant.ofEpochMilli(1_700_000_000_000);
При необходимости можно добавить наносекунды:
const i = Instant.ofEpochSecond(1_700_000_000, 500000000);
Фабричные методы parse() отвечают за преобразование
текстового представления в объект времени.
LocalDate.parse()import { LocalDate } from '@js-joda/core';
const date = LocalDate.parse('2025-05-10');
Формат строго соответствует ISO-8601.
LocalTime.parse()import { LocalTime } from '@js-joda/core';
const time = LocalTime.parse('14:30:15');
Поддерживаются доли секунды:
const time = LocalTime.parse('14:30:15.123');
LocalDateTime.parse()import { LocalDateTime } from '@js-joda/core';
const dt = LocalDateTime.parse('2025-05-10T14:30:15');
Разделитель даты и времени — T, как в ISO-формате.
Instant.parse()import { Instant } from '@js-joda/core';
const instant = Instant.parse('2025-05-10T14:30:15Z');
Обязательное указание зоны Z или смещения.
Хотя базовые parse() работают с ISO-форматом, Js-joda
поддерживает использование DateTimeFormatter:
import { LocalDate, DateTimeFormatter } from '@js-joda/core';
const formatter = DateTimeFormatter.ofPattern('dd.MM.yyyy');
const date = LocalDate.parse('10.05.2025', formatter);
Фабричный метод parse() в этом случае принимает
дополнительный аргумент, определяющий правила разбора строки.
Некоторые фабричные методы позволяют создавать новые экземпляры на основе уже существующих типов.
from()Используется для преобразования между совместимыми типами:
import { LocalDateTime, ZonedDateTime } from '@js-joda/core';
const zdt = ZonedDateTime.now();
const ldt = LocalDateTime.from(zdt);
Метод извлекает доступные компоненты и формирует новый объект без временной зоны.
Фабричные методы Js-joda выполняют скрытую нормализацию данных:
Например, при создании даты:
LocalDate.of(2025, 2, 30);
возникает ошибка, поскольку календарная система не допускает такую дату. Это отличие от некоторых стандартных JavaScript API, где подобные значения могут автоматически корректироваться.
В Js-joda отсутствует классическая перегрузка функций, но фабричные методы реализуют её через вариативность параметров.
Пример LocalTime.of:
of(hour, minute)of(hour, minute, second)of(hour, minute, second, nano)Выбор формы определяется количеством переданных аргументов.
Фабричные методы являются ключевым элементом архитектуры Js-joda:
Каждый вызов of(), now(),
parse() или from() возвращает полностью
валидный объект, готовый к использованию без дополнительной
проверки.
Фабричные методы тесно связаны с моделью временных типов:
LocalDate — дата без времениLocalTime — время без датыLocalDateTime — комбинация даты и времениZonedDateTime — дата, время и зонаInstant — абсолютный момент времениКаждый тип имеет собственный набор фабричных методов, отражающий его уровень абстракции и область ответственности.