Рубрики
Без рубрики

Руководство по классу Java Clock

Узнайте о случаях использования класса Java Clock.

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы рассмотрим класс Java Clock из пакета java.time . Мы объясним, что такое класс Clock и как мы можем его использовать.

2. Класс Часов

Clock был добавлен в Java 8 и обеспечивает доступ к мгновенному времени с использованием наилучших доступных системных часов, а также для использования в качестве поставщика времени, который может быть эффективно заглушен в целях тестирования.

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

Этот класс помогает нам проверить, что наши изменения кода работают с разными часовыми поясами или – при использовании фиксированных часов – что время не влияет на наш код.

Класс Clock является абстрактным, поэтому мы не можем создать его экземпляр. Можно использовать следующие заводские методы:

  • offset(Clock, Duration) возвращает часы, смещенные на заданную Длительность . Основной вариант использования для этого-имитация работы в будущем или прошлом
  • systemUTC() – возвращает часы, представляющие часовой пояс UTC
  • fixed(Instant, ZoneId) – всегда возвращает одно и то же Мгновенный . Ведущий пример использования для этого-тестирование, где фиксированные часы гарантируют, что тесты не зависят от текущих часов

Мы рассмотрим большинство методов, доступных в классе Clock .

2.1. мгновенный()

Этот метод возвращает мгновение, представляющее текущий момент времени, определенный часами:

Clock clock = Clock.systemDefaultZone();
Instant instant = clock.instant();
System.out.println(instant);

будет производить:

2018-04-07T03:59:35.555Z

2.2. систематичность()

Этот метод возвращает объект Clock , представляющий текущий момент времени в зоне UTC:

Clock clock = Clock.systemUTC();
System.out.println("UTC time :: " + clock.instant());

будет производить:

UTC time :: 2018-04-04T17:40:12.353Z

2.3. система()

Этот статический метод возвращает объект Clock для часового пояса, идентифицированного данным идентификатором часового пояса:

Clock clock = Clock.system(ZoneId.of("Asia/Calcutta"));
System.out.println(clock.instant());

будет производить:

2018-04-04T18:00:31.376Z

2.4. systemDefaultZone()

Этот статический метод возвращает объект Clock , представляющий текущий момент времени и использующий часовой пояс по умолчанию системы, в которой он работает:

Clock clock = Clock.systemDefaultZone();
System.out.println(clock);

Приведенные выше строки дают следующий результат (предполагая, что наш часовой пояс по умолчанию – “Азия/Калькутта”):

SystemClock[Asia/Calcutta]

Мы можем добиться того же поведения, передав ZoneId.systemDefault() :

Clock clock = Clock.system(ZoneId.systemDefault());

2.5. миллис()

Этот метод возвращает текущий момент времени часов в миллисекундах. Он предусмотрен для того, чтобы разрешить использование часов в высокопроизводительных случаях использования, когда создание объекта было бы неприемлемо . Этот метод может быть использован в тех местах, где мы в противном случае использовали бы System.currenttimemillis() :

Clock clock = Clock.systemDefaultZone();
System.out.println(clock.millis());

будет производить:

1523104441258

2.6. смещение()

Этот статический метод возвращает мгновение из указанных базовых часов с добавлением указанной длительности.

Если длительность отрицательна, то результирующий тактовый момент будет раньше заданного базового тактового.

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

Clock baseClock = Clock.systemDefaultZone();

// result clock will be later than baseClock
Clock clock = Clock.offset(baseClock, Duration.ofHours(72));
System.out.println(clock5.instant());

// result clock will be same as baseClock                           
clock = Clock.offset(baseClock, Duration.ZERO);
System.out.println(clock.instant());

// result clock will be earlier than baseClock            
clock = Clock.offset(baseClock, Duration.ofHours(-72));
System.out.println(clock.instant());

будет производить:

2018-04-10T13:24:07.347Z
2018-04-07T13:24:07.348Z
2018-04-04T13:24:07.348Z

2.7. тик()

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

Clock clockDefaultZone = Clock.systemDefaultZone();
Clock clocktick = Clock.tick(clockDefaultZone, Duration.ofSeconds(30));

System.out.println("Clock Default Zone: " + clockDefaultZone.instant());
System.out.println("Clock tick: " + clocktick.instant());

будет производить:

Clock Default Zone: 2018-04-07T16:42:05.473Z
Clock tick: 2018-04-07T16:42:00Z

2.8. тиковые Секунды()

Этот статический метод возвращает текущее мгновенное тиканье в целых секундах для данного часового пояса. Эти часы всегда будут иметь поле нано-секунды равным нулю:

ZoneId zoneId = ZoneId.of("Asia/Calcutta");
Clock clock = Clock.tickSeconds(zoneId);
System.out.println(clock.instant());

будет производить:

2018-04-07T17:40:23Z

То же самое можно сделать с помощью tick() :

Clock clock = Clock.tick(Clock.system(ZoneId.of("Asia/Calcutta")), Duration.ofSeconds(1));

2.9. тиковые минуты()

Этот статический метод возвращает мгновенное тиканье часов в целых минутах для указанного часового пояса. Эти часы всегда будут иметь поля nano-of-second и second-of-minute , установленные на ноль:

ZoneId zoneId = ZoneId.of("Asia/Calcutta");
Clock clock = Clock.tickMinutes(zoneId);
System.out.println(clock.instant());

будет производить:

2018-04-07T17:26:00Z

То же самое можно сделать с помощью tick() :

Clock clock = Clock.tick(Clock.system(ZoneId.of("Asia/Calcutta")), Duration.ofMinutes(1));

2.10. С зонами()

Этот метод возвращает копию этих часов с другим часовым поясом.

Если у нас есть экземпляр часов для определенного часового пояса, мы можем сделать копию этих часов для другого часового пояса:

ZoneId zoneSingapore = ZoneId.of("Asia/Singapore");  
Clock clockSingapore = Clock.system(zoneSingapore); 
System.out.println(clockSingapore.instant());

ZoneId zoneCalcutta = ZoneId.of("Asia/Calcutta");
Clock clockCalcutta = clockSingapore.withZone(zoneCalcutta);
System.out.println(clockCalcutta.instant());

будет производить:

2018-04-07T17:55:43.035Z
2018-04-07T17:55:43.035Z

2.11. getZone()

Этот метод возвращает часовой пояс данного Clock .

Clock clock = Clock.systemDefaultZone();
ZoneId zone = clock.getZone();
System.out.println(zone.getId());

будет производить:

Asia/Calcutta

2.12. исправлено()

Этот метод возвращает часы, которые всегда возвращают один и тот же момент . Основной пример использования этого метода-тестирование, где фиксированные часы гарантируют, что тесты не зависят от текущих часов.

Clock fixedClock = Clock.fixed(Instant.parse("2018-04-29T10:15:30.00Z"),
ZoneId.of("Asia/Calcutta"));
System.out.println(fixedClock);

будет производить:

FixedClock[2018-04-29T10:15:30Z,Asia/Calcutta]

3. Заключение

В этой статье мы погрузились в класс Java Clock и различные способы его использования с помощью доступных методов.

Как всегда, примеры кода доступны на GitHub .