Daty i czas: Klasa java.time.Clock
Klasa java.time.Clock
Klasa abstrakcyjna Clock
(zegar) zapewnia dostęp do chwili bieżącej, daty i czasu z użyciem strefy czasowej.
Obiekty Clock
mogą służyć do znajdowania chwili bieżącej, która po uwzględnieniu strefy czasowej może służyć do określenia aktualnej daty i godziny podobnie jak System.currentTimeMillis()
oraz TimeZone.getDefault()
.
Użycie klasy jest opcjonalne. Wszystkie klasy data-czas np. Instant
mają fabryczną metodę now()
, która używa zegara systemowego z uwzględnieniem domyślnej strefy czasowej.
Celem klasy jest możliwość utworzenia instancji reprezentujących różne zegary i zamienne ich stosowanie (np. zegar czasu warszawskiego, zegar czasu nowojorskiego, etc.).
Dokumentacja prezentuje przykład z wstrzykiwaniem zależności:
public class MyBean { private Clock clock; // dependency inject ... public void process(LocalDate eventDate) { if (eventDate.isBefore(LocalDate.now(clock)) { ... } } }
Konkretyzacja tej klasy powinna być klasą finalną, niezmienną (immutable) i bezpieczną wątkowo.
Instancje zegara pracują w skali czasowej ignorującej sekundy przestępne, jak to opisano w klasie Instant
. W przypadku otaczania źródeł uwzględniających sekundy przestępne, implementacja powinna uwzględnić mechanizm ‘wygładzania’ tych sekund.
Skala czasowa w Javie pozwala na użycie strefy UTC-SLS
Implementacje powinny implementować Serializable
i uwzględniać informacje o uwzględnieniu (lub nie) serializacji.
Aplikacje, które wymagają dokładniejszego czasu zegara niż System.currentTimeMillis()
muszą implementować tę klasę używając innego zegara zewnętrznego np. z serwera NTP.
Konstruktory
Konstruktor jest chroniony, a klasa abstrakcyjna i obiekty tej klasy mogą być tworzone jedynie przez podklasy.
Clock()
Metody
Zwraca | Metoda | Opis | Listing |
---|---|---|---|
boolean | equals(Object) | Porównuje obiekty. Zwraca true jeśli obiekty są równe, false w przeciwnym przypadku. | – |
int | hashCode() | Zwraca kod mieszający dla obiektu. | – |
long | millis() | Zwraca bieżącą chwilę zegara w milisekundach | 095 |
package dt19.java_time_clock; import java.time.*; public class Listing095 { public static void main(String[] args) { Clock clock = Clock.systemDefaultZone(); System.out.println(clock); long l = clock.millis(); System.out.println("l: " + l); LocalDateTime ldt = LocalDateTime.now(clock); System.out.println("ldt: " + ldt); } }
SystemClock[Europe/Belgrade] l: 1540218988304 ldt: 2018-10-22T16:36:28.327202900
Metody statyczne
Zwraca | Metoda | Opis | Listing |
---|---|---|---|
Clock | Clock.fixed(Instant , ZoneId) | Zwraca stojący zegar, który zawsze zwraca ten sam czas. | 098 |
ZoneId | Clock.getZone() | Zwraca identyfikator strefy czasowej użytej do utworzenia daty i czasu | 097 |
Instant | Clock.instant() | Zwraca aktualną chwilę tego zegara | 097 |
Clock | Clock.offset(Clock baseClock, Duration duration) | Tworzy zegar mający czas zegara baseClock przesunięty o czas trwania duration | 098 |
Clock | Clock.system(ZoneId) | Zwraca zegar używający najlepszego dostępnego zegara systemowego dla podanej strefy | 096 |
Clock | Clock.systemDeafultZone() | Zwraca zegar używający najlepszego dostępnego zegara systemowego dla domyślnej strefy czasowej. | 096 |
Clock | Clock.systemUTC() | Zwraca zegar używający najlepszego dostępnego zegara systemowego dla strefy czasowej UTC. | 096 |
Clock | Clock.tick(Clock base, Duration tickDuration) | Zwraca zegar używający bieżącej chwili zegara baseClock podający czas obcięty do pełnych podanych jednostek |
099 |
Clock | Clock.tickMinutes(ZoneId) | Zegar o czasie podanej strefy podający czas obcięty do pełnych minut | 099 |
Clock | Clock.tickSeconds(ZoneId) | Zegar o czasie podanej strefy podający czas obcięty do pełnych sekund | 099 |
Clock | Clock.withZone(ZoneId) | Zwraca kopię zegara, ale z podaną strefą czasową | 099 |
package dt19.java_time_clock; import java.time.*; public class Listing096 { public static void main(String[] args) { Clock clock = Clock.system(ZoneId.of("Europe/Belgrade")); LocalDateTime ldt = LocalDateTime.now(clock); System.out.println("ldt: " + ldt); Clock clock1 = Clock.systemDefaultZone(); LocalDateTime ldt1 = LocalDateTime.now(clock1); System.out.println("lft1: " + ldt1); Clock clock2 = Clock.systemUTC(); LocalDateTime ldt2 = LocalDateTime.now(clock2); System.out.println("ldt2: " + ldt2); } }
ldt: 2018-10-22T16:41:08.363241700 lft1: 2018-10-22T16:41:08.424427800 ldt2: 2018-10-22T14:41:08.424427800
package dt19.java_time_clock; import java.time.*; public class Listing097 { public static void main(String[] args) { Clock clock = Clock.systemDefaultZone(); ZoneId id = clock.getZone(); System.out.println("id: " + id); //- Instant inst = clock.instant(); System.out.println("inst: " + inst); } }
id: Europe/Belgrade inst: 2018-10-22T14:42:52.321254600Z
package dt19.java_time_clock; import java.time.*; public class Listing098 { public static void main(String[] args) { Clock clock = Clock.systemDefaultZone(); ZoneId id = clock.getZone(); System.out.println("id: " + id); //- Instant inst = clock.instant(); System.out.println("inst: " + inst); //- Clock clock1 = Clock.fixed(inst, id); LocalDateTime ldt = LocalDateTime.now(clock1); System.out.println("ldt: " + ldt); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } LocalDateTime ldt1 = LocalDateTime.now(clock1); System.out.println("ldt1: " + ldt1); } }
id: Europe/Belgrade inst: 2018-10-22T14:44:05.302734100Z ldt: 2018-10-22T16:44:05.302734100 ldt1: 2018-10-22T16:44:05.302734100
package dt19.java_time_clock; import java.time.*; public class Listing099 { public static void main(String[] args) { Clock clock = Clock.systemDefaultZone(); ZoneId id = clock.getZone(); System.out.println("id: " + id); //- LocalDateTime ldt = LocalDateTime.now(clock); System.out.println("ldt: " + ldt); Duration d = Duration.ofHours(1L); Clock clock1 = Clock.tick(clock, d); LocalDateTime ldt1 = LocalDateTime.now(clock1); System.out.println("ldt1: " + ldt1); // Clock clock2 = Clock.tickMinutes(id); LocalDateTime ldt2 = LocalDateTime.now(clock2); System.out.println("ldt2: " + ldt2); //- Clock clock3 = Clock.tickSeconds(id); LocalDateTime ldt3 = LocalDateTime.now(clock3); System.out.println("ldt3: " + ldt3); //- Clock clock4 = clock.withZone(ZoneId.of("Europe/Warsaw")); System.out.println(clock4); LocalDateTime ldt4 = LocalDateTime.now(clock4); System.out.println("ldt4: " + ldt4); } }
id: Europe/Belgrade ldt: 2018-10-22T16:45:31.275031100 ldt1: 2018-10-22T16:00 ldt2: 2018-10-22T16:45 ldt3: 2018-10-22T16:45:31 SystemClock[Europe/Warsaw] ldt4: 2018-10-22T16:45:31.275031100