Java ma wreszcie intuicyjny i niezawodny sposób pracy z datami i godzinami. Zasady dotyczące daty i godziny mają fundamentalne znaczenie w wielu zastosowaniach. Różne rzeczy, takie jak daty urodzenia, daty wynajmu, godziny wydarzeń i godziny otwarcia sklepów, są oparte na datach i godzinach, ale Java SE nie zapewnia wygodnego sposobu pracy z nimi. Począwszy od Java SE 8 , dostępny był zestaw pakietów Java.time , które udostępniają dobrze zorganizowany interfejs API do pracy z datami i godzinami.
Oto mała lista istniejących problemów w jego realizacji:
Tło
Kiedy po raz pierwszy pojawiła się Java , w wersji 1.0 , jedyną klasą do pracy z datami i godzinami była java.util.Date . Pierwszą rzeczą, którą zauważyli twórcy, było to, że nie reprezentuje ona „daty”. W rzeczywistości reprezentuje moment, z dokładnością do milisekund, mierzony od daty 1 stycznia 1970 r. Jednak biorąc pod uwagę fakt, że metoda toString() Date wyświetla datę i godzinę w strefie czasowej określonej w ustawieniach Java komputera , niektórzy programiści błędnie doszli do wniosku, że Date może współpracować ze strefami czasowymi. Naprawienie tej klasy okazało się na tyle trudne (lub tak leniwe), że w wersji 1.1 musieliśmy dodać nową klasę - java.util.Calendar . Niestety klasa Calendar okazała się niewiele lepsza od Date .- Zmienny. Klasy takie jak data i godzina powinny być niezmienne.
- Przesunięcia. Lata w dacie zaczynają się od roku 1900, miesiące w obu klasach zaczynają się od zera.
- Nazwy. Data nie jest w rzeczywistości „datą”, a Kalendarz nie jest kalendarzem.
- Formatowanie. Formatowanie działa tylko z datą, a nie z kalendarzem i nie jest bezpieczne dla wątków.
Recenzja
Nowe API Java.time zawiera 5 pakietów:- java.time - pakiet podstawowy zawierający obiekty do przechowywania wartości
- java.time.chrono - zapewnia dostęp do różnych kalendarzy
- java.time.format - formatowanie i rozpoznawanie daty i godziny
- java.time.temporal - biblioteki niskiego poziomu i zaawansowana funkcjonalność
- java.time.zone - klasy do pracy ze strefami czasowymi
Daktyle
Klasa LocalDate jest jedną z najważniejszych w nowym API . Zawiera niezmienną wartość reprezentującą datę. Nie można ustawić czasu ani strefy czasowej. Nazwa „lokalny” może być Ci znana z Joda-Time i pierwotnie pochodzi z normy ISO-8601 . Oznacza to właśnie brak strefy czasowej. Zasadniczo LocalDate to opis daty, na przykład „5 kwietnia 2014 r.”. Rzeczywisty czas tej daty będzie się różnić w zależności od Twojej strefy czasowej. Przykładowo w Australii data ta będzie 10 godzin wcześniejsza niż w Londynie i 18 godzin wcześniej niż w San Francisco. Klasa LocalDate posiada wszystkie powszechnie potrzebne metody:LocalDate date = LocalDate.of(2014, Month.JUNE, 10); int year = date.getYear(); // 2014 Month month = date.getMonth(); // Июнь int dom = date.getDayOfMonth(); // 10 DayOfWeek dow = date.getDayOfWeek(); // Вторник int len = date.lengthOfMonth(); // 30 (дней в Июне) boolean leap = date.isLeapYear(); // false (не високосный год)
W naszym przykładzie widzimy datę utworzoną metodą fabryczną (wszystkie konstruktory są prywatne). Następnie prosimy obiekt o pewne dane. Należy pamiętać, że wyliczenia
Month i
DayOfWeek mają na celu zwiększenie czytelności i niezawodności kodu. W poniższym przykładzie zobaczymy jak zmodyfikować datę. Ponieważ klasa jest niezmienna, wynikiem będą nowe obiekty, ale oryginalny pozostanie taki, jaki był.
LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.withYear(2015); // 2015-06-10 date = date.plusMonths(2); // 2015-08-10 date = date.minusDays(1); // 2015-08-09
Są to stosunkowo proste zmiany, ale często trzeba dokonać bardziej skomplikowanych modyfikacji daty. Istnieje do tego specjalny mechanizm w
API java.time – TemporalAdjuster . Jego celem jest udostępnienie wbudowanego narzędzia umożliwiającego manipulację datami, na przykład uzyskanie obiektu odpowiadającego ostatniemu dniu miesiąca. Niektóre z nich są zawarte w
interfejsie API , ale możesz dodać własne. Używanie modyfikatorów jest bardzo łatwe, ale wymaga statycznego importu:
import static java.time.DayOfWeek.* import static java.time.temporal.TemporalAdjusters.* LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.with(lastDayOfMonth()); date = date.with(nextOrSame(WEDNESDAY));
używanie modyfikatorów znacznie upraszcza kod. Nikt nie chce widzieć wielu ręcznych manipulacji datami. Jeśli w Twoim projekcie kilkakrotnie dochodzi do manipulacji datami, napisz własny modyfikator, a Twój zespół będzie mógł go użyć jako już napisanego i przetestowanego komponentu.
GO TO FULL VERSION