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 .