Zielony Smok - logo witryny

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

Metoda klasy Clock
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

Metody statyczne klasy Clock
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