JSR 310: Instant

Класс java.time.Instant описывает точное время и работает с метками времени в формате UTC. Для большинства технических задач, например, хранения, логгирования и аудита, Instant подходит лучше всего.

Получение экземпляра Instant

Получить экземпляр Instant можно при помощи InstantSourceClock и следующих статических методов класса Instant:

  • now — текущая метка времени
  • parse — парсинг строки, содержащей метку времени
  • ofEpochSecond — на основе количества секунд с начала эпохи UNIX (полночь 1 января 1970 года)
  • ofEpochMilli — на основе количества миллисекунд с начала эпохи UNIX
  • from —  на основе экземпляров других классов, описывающих точное время, таких как ZonedDateTime и OffsetDateTime

Единицы измерения и свойства времени

Instant поддерживает следующие единицы измерения времени:

  • NANOS — наносекунды
  • MICROS — микросекунды
  • MILLIS — миллисекунды
  • SECONDS — секунды
  • MINUTES — минуты
  • HOURS — час
  • HALF_DAYS — половины суток
  • DAYS — сутки

Instant не поддерживает единицы измерения времени больше дня, так как является универсальным и опирается на «физическое» время, а недели, месяцы и годы — человеческие условности, и их продолжительность может разниться в зависимости от используемого календаря.

Проверить поддержку единицы измерения времени классом вы можете при помощи метода isSupported:

Instant поддерживает всего 4 свойства даты/времени:

  • INSTANT_SECONDS — количество секунд с начала эпохи UNIX
  • NANO_OF_SECOND — наносекунды текущей метки времени
  • MICRO_OF_SECOND — микросекунды текущей метки времени
  • MILLI_OF_SECOND — миллисекунды текущей метки времени

Примеры использования:

Получение данных из Instant

Для получения частей метки времени могут быть использованы методы get и getLong, объявленные в интерфейсе TemporalAccessor, а так же методы getNano и getEpochSecond. При попытке получения не поддерживаемого свойства будет выброшено исключение UnsupportedTemporalTypeException.

Для получения частей метки времени так же может быть использован метод query:

Метод range позволяет получить информацию о возможном диапазоне значений той или иной части метки времени:

Сравнение экземпляров Instant

Экземпляры Instant можно сравнивать при помощи методов isBeforeisAfter и более общих compareTo и equals.

МетодДанныеРезультат
x.isAfter(y)x > ytrue
x.isAfter(y)x < yfalse
x.isAfter(y)x == yfalse
x.isBefore(y)x > yfalse
x.isBefore(y)x < ytrue
x.isBefore(y)x == yfalse
x.compareTo(y)x > y1
x.compareTo(y)x < y-1
x.compareTo(y)x =⇒ y0
x.equals(y)x == ytrue
x.equals(y)x != yfalse

Вычисление времени

Экземпляры класса Instant являются неизменяемыми, но класс предоставляет методы plusminustruncatedTo и with, которые возвращают копии текущего экземпляра класса с указанными изменениями.

Методы plusplusNanosplusMillis и plusSeconds используются для получения нового экземпляра Instant, значение которого будет больше исходного на указанный промежуток времени.

Метод plus имеет два варианта: plus(TemporalAmount amountToAdd) и plus(long amountToAdd, TemporalUnit unit). В первом случае могут быть использованы экземпляры классов java.time.Duration и java.time.Period, но стоит помнить, что максимальная единица времени, которую можно использовать — день:

Методы plusNanosplusMillis и plusSeconds добавляют указанное количество наносекунд, миллисекунд и секунд соответственно.

Для получения меток времени, значения которых меньше исходного используются методы minusminusNanosminusMillis и minusSeconds, сигнатуры которых аналогичны методам plus…​, а поведение — противоположно.

В качестве аргументов вызова методов plus…​ и minus…​ могут быть использованы отрицательные значения:

Для усечения метки времени используется метод truncatedTo, а в качестве аргумента вызова указывается единица измерения времени, до которой требуется усечь метку времени:

Значение Instant может быть усечено до дней.

Кроме этого вы можете менять значения поддерживаемых свойств метки времени при помощи метода with:

Однако стоит помнить, что Instant поддерживает весьма ограниченное количество свойств, которые были описаны выше.

Несколько операций над Instant могут быть объединены при помощи перегруженной версии метода with(TemporalAdjuster):

Впрочем, стоит помнить, что TemporalAdjuster работает с интерфейсом Temporal, а не с Instant.

Резюме

  • Instant работает с точным временем в UTC и лучше всего подходит для технических целей: хранения, логгирования и аудита данных
  • Instant поддерживает ограниченный набор свойств: количество секунд и наносекунд, прошедших с полуночи 1 января 1970 года
  • Instant опирается на физические единицы времени, максимальная из которых — день
  • При помощи методов get…​ вы можете получить части метки времени
  • Для сравнения экземпляров класса Instant могут быть использованы методы isBeforeisAftercompareTo и equals
  • Экземпляры класса Instant неизменяемы, но при помощи методов plus…​minus…​ и truncatedTo вы можете выполнять различные манипуляции над меткой времени, получая в результате новый экземпляр класса Instant