1. Wprowadzenie do API Date Time
Twórcom Javy nie spodobała się obecna sytuacja z klasami Date i Calendar. W swoim czasie byli dobrzy, ale czasy się zmieniają. Potrzebowaliśmy czegoś prostego, wydajnego i niezawodnego. A teraz, wraz z wydaniem Java8 (15 lat po wydaniu ), Calendar
wprowadzono Java Date Time API : zestaw klas, które powinny rozwiązać wszystkie możliwe problemy z czasem.
Zajęć było tak dużo, że postanowili podzielić je na kilka pakietów:
Pakiet java.time
jest pakietem podstawowym dla Java Date Time API: zawiera klasy takie jak LocalDate
, LocalTime
, LocalDateTime
, Instant
, Period
, Duration
. Wszystkie obiekty tych klas to immutable
: nie można ich zmienić po utworzeniu.
Pakiet java.time.format
zawiera klasy do formatowania czasu: konwersji czasu (i daty) na ciąg tekstowy i odwrotnie. Na przykład zawiera klasę ogólną, taką jak DateTimeFormatter
, która zastąpiła SimpleDateFormat
.
Pakiet java.time.zone
zawiera klasy do pracy ze strefami czasowymi (strefy czasowe). Zawiera klasy takie TimeZone
jak ZonedDateTime
. Jeśli piszesz kod dla serwera, którego klienci znajdują się w różnych częściach świata, te klasy będą Ci bardzo potrzebne.
2. KlasaLocalDate
Pierwszą i najbardziej użyteczną klasą z interfejsu Date Time API, której się przyjrzymy, jest klasa LocalDate
. Jak można się domyślić po nazwie, ta klasa jest przeznaczona do pracy z datami.
Obiekty tej klasy nie zmieniają się po utworzeniu (klasa LocalDate
jest niezmienna). Ale dodał do klasy prostotę i niezawodność. Zwłaszcza jeśli kilka wątków (wątków wykonania) oddziałuje jednocześnie z obiektem klasy.
Aby utworzyć nowy obiekt klasy LocalDate
, musisz użyć jednej ze statycznych metod. Oto lista głównych.
Pobieranie bieżącej daty
Aby uzyskać aktualną datę, musisz użyć metody statycznej now()
. To o wiele łatwiejsze niż się wydaje:
LocalDate today = LocalDate.now();
Gdzie today
jest zmienną klasy LocalDate
i LocalDate.now()
jest wywołaniem metody statycznej now()
w klasie LocalDate
.
Przykład:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
Uzyskanie daty w określonej strefie czasowej
Klasa LocalDate
posiada również swego rodzaju metodę now(ZoneId)
, która pozwala uzyskać aktualną datę w określonej strefie czasowej.
Aby to zrobić, potrzebujemy innej klasy - ZoneId
(java.time.ZoneId). Posiada metodę of()
, która zwraca obiekt ZoneId
według nazwy strefy czasowej.
Aby ustalić aktualną datę w Szanghaju, należy wpisać kod:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
Listę nazw wszystkich stref czasowych (strefy czasowej) można znaleźć w Internecie.
3. Uzyskanie konkretnej daty
Aby otrzymać obiekt LocalDate
zawierający określoną datę, należy użyć metody statycznej of()
. Wszystko wygląda również bardzo prosto i przejrzyście:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
Gdzie date
jest zmienną klasy LocalDate
i jest wywołaniem metody statycznej w klasie .LocalDate.of()
of()
LocalDate
Również tutaj widzimy użycie specjalnej stałej FEBRUARY
klasowej Month
(java.time.Month) do ustawienia miesiąca lutego.
Możesz ustawić miesiąc w staromodny sposób - używając liczby:
LocalDate date = LocalDate.of(2019, 2, 22);
Licho? Zamiast miesiąca lutego? Czy chodzi o to, że miesiące są teraz znowu policzone od jednego?
Tak, prawie 20 lat po stworzeniu Javy, miesiące wreszcie przestały być liczone od zera.
Przykład:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
Uzyskaj datę po numerze dnia
Istnieje jeszcze jedna interesująca metoda tworzenia daty: za pomocą tej metody ofYearDay
można uzyskać datę podając tylko numer roku i numer dnia w roku. Ogólny pogląd jest taki:
LocalDate date = LocalDate.ofYearDay(год, день);
Gdzie rok to numer roku, a dzień to numer dnia w roku.
Przykład:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
100. dzień 2019 roku to 10 kwietnia.
Uzyskiwanie daty uniksowej
Pamiętasz, że obiekty klasy Date
zawsze przechowywały czas w milisekundach od 1 stycznia 1970 roku? Aby programiści nie przegapili starych dobrych czasów, do klasy LocalDate
dodano metodę ofEpochDay()
, która zwraca datę liczoną od 1 stycznia 1970 roku. Ogólny pogląd jest taki:
LocalDate date = LocalDate.ofEpochDay(день);
Gdzie день
jest liczba dni od 1 stycznia 1970 r.
Przykład:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
4. Pozyskiwanie fragmentów daty
Nie możesz zmienić obiektów klas LocalDate
, ale nadal możesz uzyskać oddzielne fragmenty dat. Aby to zrobić, obiekty klasy LocalDate
mają kilka metod:
metoda | Opis |
---|---|
|
Zwraca rok od określonej daty |
|
Zwraca miesiąc daty, jedną ze stałych specjalnychJANUARY, FEBRUARY, ...; |
|
Zwraca numer miesiąca z daty. Styczeń == 1. |
|
Zwraca numer dnia w miesiącu |
|
Zwraca numer dnia od początku roku |
|
Zwraca dzień tygodnia: jedną ze stałych specjalnychMONDAY, TUESDAY, ...; |
|
Zwraca epokę: stała BC (przed obecną erą) i CE (bieżąca era) |
Przykład:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
5. Zmień datę w obiekcieLocalDate
Klasa LocalDate
zawiera kilka metod, które umożliwiają pracę z datami. Metody te są implementowane podobnie jak metody klasowe String
: każda z tych metod nie zmienia istniejącego obiektu LocalDate, lecz zwraca nowy z wymaganymi danymi.
Oto metody klasy LocalDate
:
metoda | Opis |
---|---|
|
Dodaje określoną liczbę dni do daty |
|
Dodaje tygodnie do daty |
|
Dodaje miesiące do daty |
|
Dodaje lata do daty |
|
Odejmuje dni od daty |
|
Odejmuje tygodnie od daty |
|
Odejmuje miesiące od daty |
|
Odejmuje lata od daty |
Przykład:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
Obiekt birthday
, którego metody wywołujemy, nie zmienia się. Zamiast tego jego metody zwracają nowe obiekty, które zawierają żądane dane.
GO TO FULL VERSION