JSR 310: Источники времени

Прежде чем переходить к более подробному описанию классов, описывающих метки времени, неплохо было бы упомянуть источники времени, хотя на практике они используются не так часто. Источники времени представлены интерфейсом InstantSource и его основной реализацией — Clock.

InstantSource используется для получения количества миллисекунд, прошедших с начала эпохи UNIX в UTC. Кроме этого InstantSource может быть использован для создания экземпляров классов Instant и Clock. Экземпляр InstantSource может быть получен при помощи одного из четырёх статических методов:

  • system — возвращает источник времени, использующий системные часы.
  • fixed — возвращает фиксированный источник времени на основе переданного экземпляра Instant. Такой источник времени всегда будет возвращать одно и то же время.
  • offset — возвращает источник времени, возвращающий время с указанным смещением.
  • tick — возвращает источник времени, который обновляет время с указанной периодичностью

Стандартные реализации InstantSource опираются на системное время, однако существуют и сторонние реализации, использующие серверы точного времени (NTP).

InstantSource предоставляет 3 метода:

  • instant — для получения Instant с текущей для источника меткой времени
  • millis — для получения количества миллисекунд с начала эпохи UNIX текущей для источника метки времени
  • clock — для получения экземпляра Clock для указанного часового пояса

Clock аналогичен InstantSource, но учитывает часовой пояс и может быть использован для создания экземпляров любых классов, описывающих метки времени, при помощи метода now(Clock clock). Часовой пояс, указанный при создании экземпляра Clock никак не влияет на значение создаваемых экземпляров Instant, так как последний всегда работает в UTC.

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

  • systemDefaultZone — получение системных часов с системным часовым поясом
  • systemUTC — получение системных часов с UTC
  • system — получение системных часов с указанным часовым поясом
  • fixed — получение фиксированных часов
  • offset — получение часов с указанным сдвигом
  • tick — получение часов с указанной периодичностью обновления
  • tickMillis — получение часов с обновлением раз в n миллисекунд
  • tickSeconds — получение часов с обновлением раз в n секунд
  • tickMinutes — получение часов с обновлением ра в n минут

Аналогично InstantSource класс Clock предоставляет доступ к Instant и количеству миллисекунд с начала эпохи UNIX текущей для часов метки времени. Кроме этого предоставляются методы getZone и withZone для получения часового пояса часов и создания копии часов с указанным часовым поясом соответственно.

Источники времени могут быть полезны, если вы хотите больше контроля над кодом. Например, такой код сложно тестировать точно:

Максимум вы сможете написать такой тест:

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

И этот код можно покрыть более точными тестами: