Перейти к основному содержимому

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

· 5 мин. чтения

1. Обзор

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

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

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

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

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

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

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

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

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

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

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

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

2018-04-07T03:59:35.555Z

2.2. системаUTC()

Этот метод возвращает объект 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. системаDefaultZone()

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

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

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

SystemClock[Asia/Calcutta]

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

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

2.5. миллис()

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

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. тикминуты()

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

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. получитьзону()

Этот метод возвращает часовой пояс данного 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 .