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 .