В библиотеке js-joda тип Instant представляет собой
фиксированный момент времени на временной шкале UTC без привязки к
часовому поясу и локальным календарным правилам. Это модель абсолютного
времени, в которой игнорируются смещения зон, летнее время и любые
человеческие интерпретации календаря.
Основное свойство Instant заключается в том, что он
описывает:
Instant не содержит информации о календарной дате в
локальном смысле — только абсолютную временную координату.
Все значения Instant строятся относительно эпохи:
1970-01-01T00:00:00Z
Этот момент считается нулевой точкой:
Внутренне Instant оперирует двумя компонентами:
Такое разбиение позволяет избегать ошибок округления при высокоточной работе со временем.
Основные способы создания экземпляра Instant:
import { Instant } from '@js-joda/core';
const now = Instant.now();
now() возвращает текущее время системы, приведённое к
UTC.
const instant = Instant.ofEpochSecond(1700000000);
Дополнительно можно задать наносекунды:
const instant = Instant.ofEpochSecond(1700000000, 500000000);
Здесь:
const instant = Instant.ofEpochMilli(Date.now());
Этот способ часто используется при взаимодействии с JavaScript API, поскольку большинство веб-интерфейсов оперируют миллисекундами.
Instant поддерживает парсинг ISO-8601 формата:
const instant = Instant.parse('2025-01-01T12:00:00Z');
Обязательное условие — наличие зоны Z или смещения, так
как Instant всегда привязан к UTC.
Instant фиксирует точку во времени и не изменяется после
создания. Все операции возвращают новые экземпляры.
const t1 = Instant.now();
const t2 = t1.plusSeconds(10);
Несмотря на добавление времени, исходный объект остаётся неизменным.
Поддерживаются операции смещения:
instant.plusSeconds(60);
instant.minusSeconds(60);
instant.plusMillis(500);
instant.minusMillis(500);
Также доступна работа с наносекундами:
instant.plusNanos(1000);
instant.minusNanos(1000);
Эти операции позволяют точно управлять временными интервалами без потери точности.
Поскольку Instant представляет числовую шкалу времени,
сравнение выполняется строго и однозначно.
instant1.isBefore(instant2);
instant1.isAfter(instant2);
instant1.equals(instant2);
Сравнение не зависит от часового пояса или локальных правил календаря.
Для вычисления интервала используется Duration:
import { Duration } from '@js-joda/core';
const start = Instant.parse('2025-01-01T00:00:00Z');
const end = Instant.parse('2025-01-01T00:01:30Z');
const duration = Duration.between(start, end);
Результат выражается в секундах и наносекундах.
Instant часто используется как базовый слой для
построения локальных дат:
import { ZoneId, ZonedDateTime } from '@js-joda/core';
const instant = Instant.now();
const zoned = instant.atZone(ZoneId.of('Europe/Berlin'));
Здесь происходит наложение временной зоны, что превращает абсолютное время в локальное представление.
При работе с Instant важно учитывать:
Например:
const instant = Instant.parse('2025-06-01T00:00:00Z');
const berlin = instant.atZone(ZoneId.of('Europe/Berlin'));
const tokyo = instant.atZone(ZoneId.of('Asia/Tokyo'));
Один и тот же момент будет отображён по-разному в зависимости от зоны.
JavaScript ограничен внутренним числовым представлением времени, поэтому:
Dateconst instant = Instant.ofEpochMilli(Date.now());
В этом случае наносекунды всегда равны нулю.
Стандартное строковое представление:
instant.toString();
Результат:
2025-01-01T12:00:00Z
Это ISO-8601 формат с обязательной UTC-зоной.
Instant применяется как базовый тип в системах, где
требуется:
Его использование исключает неоднозначность, возникающую из-за локальных календарей и переходов на летнее время.
В экосистеме js-joda существуют альтернативы:
LocalDateTime — дата и время без зоныZonedDateTime — дата и время с зонойInstant — абсолютная временная точкаКлючевое различие:
LocalDateTime описывает «как отображается»Instant описывает «когда это произошло»const instant = Instant.ofEpochMilli(Date.now());
или через Date:
const instant = Instant.ofEpochMilli(new Date().getTime());
Эти способы часто используются при миграции с нативного API JavaScript.
При работе с длительными интервалами Instant сохраняет
стабильность:
const start = Instant.now();
// длительная операция
for (let i = 0; i < 1e6; i++) {}
const end = Instant.now();
const diff = Duration.between(start, end);
Результат выражает реальное время выполнения без влияния системных часовых зон или календарных переходов.
Instant часто используется как нижний уровень
абстракции:
Он служит универсальной точкой согласования времени в распределённых приложениях, где локальные представления времени недопустимы как источник истины.