Instant в js-joda описывает точку на временной шкале в
UTC без привязки к календарю, часовому поясу или локальным правилам
отображения времени. Это базовый «атом времени», от которого строятся
преобразования в более высокоуровневые типы: календарные даты, локальные
даты-время и зональные представления.
Ключевая особенность Instant — отсутствие контекста. Он
не содержит информации о:
Это делает его стабильной точкой обмена между различными временными представлениями.
Одним из основных способов получения Instant является
работа с Unix-эпохой:
import { Instant } from '@js-joda/core'
const i1 = Instant.ofEpochSecond(0)
const i2 = Instant.ofEpochMilli(0)
ofEpochSecond — интерпретация секунд с
1970-01-01T00:00:00ZofEpochMilli — интерпретация миллисекундТакже возможен обратный переход:
const instant = Instant.now()
const millis = instant.toEpochMilli()
const seconds = instant.epochSecond
Важно: epochSecond возвращает целое
значение секунд без дробной части, тогда как миллисекунды сохраняют
точность.
Наиболее частый сценарий — перевод Instant в
локализованное представление через временную зону.
import { Instant, ZoneId } from '@js-joda/core'
const instant = Instant.now()
const zone = ZoneId.of('Europe/Moscow')
const zoned = instant.atZone(zone)
Instant + ZoneId →
ZonedDateTime
Результат включает:
ZonedDateTime становится полным представлением момента в
конкретном контексте.
LocalDateTime представляет дату и время без зоны.
Преобразование требует сначала привязки к зоне, затем извлечения
локального представления:
import { Instant, ZoneId } from '@js-joda/core'
const instant = Instant.now()
const zone = ZoneId.of('Asia/Almaty')
const localDateTime = instant.atZone(zone).toLocalDateTime()
Если требуется только календарная дата без времени:
const instant = Instant.now()
const zone = ZoneId.of('Asia/Almaty')
const localDate = instant.atZone(zone).toLocalDate()
Для извлечения только времени суток:
const instant = Instant.now()
const zone = ZoneId.of('Asia/Almaty')
const localTime = instant.atZone(zone).toLocalTime()
OffsetDateTime добавляет фиксированное смещение UTC без
полноценной временной зоны.
import { Instant, ZoneOffset } from '@js-joda/core'
const instant = Instant.now()
const offsetDateTime = instant.atOffset(ZoneOffset.UTC)
OffsetDateTime оперирует фиксированным offset;ZonedDateTime включает полные правила зоны.const instant = zonedDateTime.toInstant()
Так как LocalDateTime не содержит зоны, требуется явное
указание:
const instant = localDateTime.atZone(zone).toInstant()
const instant = offsetDateTime.toInstant()
Переход между Instant и локальными типами всегда связан
с потенциальной потерей контекста.
Любое преобразование Instant в локальные типы невозможно
без ZoneId.
Instant → ZoneId → LocalDateTime / LocalDate / LocalTime
Разные зоны дают разные результаты:
const instant = Instant.parse('2024-01-01T00:00:00Z')
const moscow = instant.atZone(ZoneId.of('Europe/Moscow'))
const tokyo = instant.atZone(ZoneId.of('Asia/Tokyo'))
Один и тот же Instant приводит к разным календарным
датам и времени в разных регионах.
const instant = Instant.parse('2024-05-01T10:15:30Z')
Формат строго соответствует ISO-8601 и всегда предполагает UTC.
const str = instant.toString()
Результат всегда нормализован в UTC.
Instant поддерживает усечение через
ChronoUnit, что часто используется перед конвертациями:
import { ChronoUnit } from '@js-joda/core'
const truncated = instant.truncatedTo(ChronoUnit.SECONDS)
Усечение полезно при согласовании с системами, не поддерживающими высокую точность.
const instant = Instant.now()
const local = instant.atZone(ZoneId.of('Asia/Almaty')).toLocalDateTime()
Используется для человекочитаемых логов.
const instant = Instant.now()
const millis = instant.toEpochMilli()
Сохраняется как числовое значение.
const instant = Instant.now()
const view = instant
.atZone(userZone)
.toLocalDateTime()
const instant = Instant.parse(payload.timestamp)
const normalized = instant.toEpochMilli()
При преобразованиях следует учитывать:
Instant всегда оперирует наносекундами внутри модели
js-joda;toEpochMilli() выполняет округление вниз;ChronoUnit влияет на потерю точности при усечении.Структура преобразований в js-joda выстраивается вокруг одной логики:
Instant — абсолютная точка времени;ZoneId — контекст интерпретации;ZonedDateTime — полное представление;LocalDateTime / LocalDate / LocalTime — частичные
представления.Каждое преобразование является либо добавлением контекста (zone), либо его удалением (local extraction), либо нормализацией (epoch conversion).
// некорректно
const local = Instant.now().toLocalDateTime()
Instant не имеет такого метода, требуется зона.
Instant.ofEpochSecond(1000)
Может быть ошибочно воспринято как миллисекунды, хотя это секунды.
const data = {
time: instant.toString()
}
Без зоны невозможно восстановить локальное представление.
В js-joda Instant выступает фундаментом, вокруг которого
строится вся система временных преобразований. Любая работа с
календарём, временем суток или локальными представлениями сводится к
цепочке:
Instant → ZoneId → целевой тип → (LocalDateTime | LocalDate | LocalTime | ZonedDateTime | OffsetDateTime)
И обратные преобразования всегда возвращают систему к исходной точке — универсальному моменту времени без контекста.