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

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

1. обзор

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

2. КлассClock

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

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

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

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

  • offset(Clock, Duration) возвращает часы, которые смещены на указанныйDuration. Основным вариантом использования этого является симуляция бега в будущем или в прошлом.

  • systemUTC() –  возвращает часы, представляющие часовой пояс UTC

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

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

2.1. instant()с

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

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

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

2018-04-07T03:59:35.555Z

2.2. systemUTC()с

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

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

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

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

2.3. system()с

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

Этот метод возвращает текущий момент часов в миллисекундах. Предоставляетсяto allow the use of the clock in high-performance use cases where the creation of an object would be unacceptable. Этот метод можно использовать там, где в противном случае мы использовали быSystem.currentTimeInMillis():

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

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

1523104441258

2.6. offset()с

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

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

Using offset, we can get instants in the past and future of the given base clock. Если мы передадим нулевую продолжительность, мы получим те же часы, что и заданные базовые часы:

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. tick()с

Этот статический метод возвращает моменты из указанных часовrounded to the nearest occurrence of the specified duration. Указанная длительность часов должна быть положительной:

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. tickSeconds()с

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

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. tickMinutes()с

Этот статический метод возвращает тиканье часов в целых минутах для указанного часового пояса. Эти часы всегда будут иметь поля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. withZone()с

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

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

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. фиксированный()

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

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. Заключение

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

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