Instant и временные метки
Instant — конкретная точка на временной шкале
Когда важно зафиксировать не «местное время на часах», а момент, когда событие действительно произошло,
нужен Instant. Он не хранит название города и не показывает привычную локальную дату сам по себе.
Его задача — однозначно представить точку на временной шкале относительно UTC.
Instant createdAt = Instant.now();
System.out.println(createdAt);
Строковое представление обычно выглядит примерно как
2026-09-18T09:30:00Z.
Буква Z означает нулевое смещение от UTC.
Такое значение удобно хранить для времени создания записи, отправки события,
начала запроса или любого другого факта, который должен означать один и тот же момент для всех систем.
Epoch time
Во многих протоколах и хранилищах момент передают числом относительно эпохи
1970-01-01T00:00:00Z.
Instant умеет преобразовываться в секунды или миллисекунды от этой точки.
Instant instant = Instant.parse("2026-09-18T09:30:00Z");
long seconds = instant.getEpochSecond();
long millis = instant.toEpochMilli();Обратное преобразование выполняется через фабричные методы:
Instant fromMillis = Instant.ofEpochMilli(millis);Instant и локальное время
Один Instant может отображаться по-разному в разных часовых поясах.
Чтобы получить человеческую дату и время, к моменту нужно применить правила зоны.
Instant instant = Instant.parse("2026-09-18T09:30:00Z");
ZonedDateTime berlin = instant.atZone(ZoneId.of("Europe/Berlin"));
ZonedDateTime tokyo = instant.atZone(ZoneId.of("Asia/Tokyo"));
berlin и tokyo показывают разные значения на часах,
но указывают на один и тот же момент.
Когда выбирать Instant
Если значение отвечает на вопрос «когда именно это произошло?»,
Instant обычно является хорошей базовой моделью.
Если же смысл — «каждый день в 09:00» или «день рождения 12 мая»,
то абсолютный момент появляется только после добавления контекста и другой тип выражает задачу точнее.
Проверь себя
Для какого значения лучше всего подходит Instant?