Czas Joda a czas Java

19

Chociaż Joda jest bogata w funkcje i bardziej wyrafinowana niż standardowy czas Java, nie zawsze może być najlepszym rozwiązaniem. Jak zdecydować, czy powinienem używać Joda Time lub Java Time w dowolnym kodzie Java?

Czy istnieje jakaś wskazówka, która mówi nam, jak wybrać właściwą w zależności od naszych wymagań?

rycerz Jedi
źródło
5
Wykorzystaj to, co najlepsze z obu światów, korzystając z nowego interfejsu API Data i czas zawartego w Javie 8 . Jest pod silnym wpływem Jody Time. W rzeczywistości głównym autorem jest Stephen Colebourne, autor Jody Time.
Joachim Sauer
1
@JachachSSauer Czy pojawił się w ostatecznej wersji, czy stanie się to, gdy uruchomi się Java 8?
m3th0dman
@ m3th0dman: zostanie dołączony do ostatecznej wersji Java 8, nie został jeszcze wydany. GA jest obecnie zaplanowane na 09.09.2013 .
Joachim Sauer
Zarówno Joda-Time, jak i oryginalne klasy daty i godziny Java są teraz przestarzałe przez klasy java.time wbudowane w Javę 8, Java 9 i nowsze wersje .
Basil Bourque,

Odpowiedzi:

29

Joda Time to takie ulepszenie w stosunku do biblioteki czasu Java, że ​​prawie zawsze jest właściwym wyborem, z wyjątkiem następujących wyjątków:

  1. Gdy dodanie do projektu zależności osób trzecich jest trudne lub niepożądane

  2. Gdy jego użycie w interfejsie publicznym spowodowałoby problemy, np. Uzyskanie ORM do obsługi pól czasu java i Joda

Jednak w przypadku 2) lepiej byłoby, jeśli to możliwe, używać Jody wewnętrznie.

Powyższe rzeczy warto pamiętać, ale powinny być rzadkie. W razie wątpliwości idź z Jodą.

Robert Johnson
źródło
Powiedz mi, co znaczy „używaj Jody wewnętrznie”. Jestem początkującym i nie znam tych wszystkich rzeczy.
Jedi Knight
5
@Jedi Knight: oznacza to, że aplikacja używa Jody dla własnej logiki i konwertuje tylko do / z java.util.Date, gdy komunikuje się z zewnętrznym systemem, który tego wymaga.
Michael Borgwardt,
2
Przez „wewnętrzny” może być wewnętrzny dla aplikacji jako całości (jak w przykładzie Michaela), ale może być wewnętrzny dla klasy lub tylko określonej metody. Powiedzmy na przykład, że masz metodę narzędzia, która pobiera dwa obiekty Java Date i oblicza liczbę dni roboczych między nimi, ale zawiera błąd. Aby to naprawić, może być łatwiej przepisać tę metodę za pomocą JodaTime, ale możesz nie być w stanie poświęcić czasu na refaktoryzację całego kodu, który wywołuje tę metodę, więc podpis metody pozostaje niezmieniony. W tym przypadku używasz Jody „wewnętrznie” w tej metodzie.
Robert Johnson
Do Twojej wiadomości, projekt Joda-Time jest teraz w trybie konserwacji , a zespół doradza migrację do klas java.time . Zobacz samouczek Oracle .
Basil Bourque,
13

Zauważ, że na stronie Joda-Time napisano:

Standardowe klasy daty i godziny przed Java SE 8 są słabe. Dzięki bezpośredniemu rozwiązaniu tego problemu Joda-Time stała się de facto standardową biblioteką daty i godziny dla języka Java. Należy pamiętać, że od wersji Java SE 8 użytkownicy proszeni są o migrację do java.time (JSR-310).

Główny współautor Joda-Time , jodastephen , jest także głównym współtwórcą JSR-310, co można zobaczyć w repozytorium GitHub powiązanym z http://www.threeten.org/ . Nawiasem mówiąc, jodastephen ma również uchwyt SO ...

Myślę, że można bezpiecznie stwierdzić, że możemy czuć się komfortowo dzięki nowemu interfejsowi API Data i godzina, jak przewidziano w Javie 8 i nowszych.

Niektóre dodatkowe odniesienia:

Racja
źródło
12

Interfejs API standardowej daty Java jest tak fundamentalnie zepsuty, że często zastanawiałem się nad dodaniem Joda Time do rozszerzeń biblioteki JVM, aby domyślnie ładował się ścieżkę klas z resztą interfejsu API Java.

Jeśli kiedykolwiek miałeś za zadanie modernizację internacjonalizacji i stref czasowych w starszej aplikacji Java i próbowałeś użyć samego standardowego interfejsu API Java, zrozumiesz, co mam na myśli. Byłem w stanie zamienić tysiące asinine linii kodu w mniej niż sto. Wzrost wydajności jest nie do pomyślenia.

Ponadto standardowy interfejs API Data nie jest intuicyjny, ponieważ płynny interfejs Joda API można pobrać w ciągu kilku godzin, a nie tygodni. Twoja analogia do próby przedostania się na oddaloną o dwie mile wyspę jest bardziej podobna do następującej.

1) Motorówka, która zabierze Cię na wyspę w zaledwie 6 minut.

Lub...

2) Prowizoryczna bambusowa tratwa związana z winoroślami podczas huraganu kierowanego przez szalonego faceta, którego najlepszym przyjacielem jest siatkówka.

Jak stwierdzono w innych odpowiedziach, kilka wad, takich jak ORM, przestaje istnieć, ponieważ Hibernacja ma teraz wtyczki, które umożliwiają mapowanie właściwości komponentu bean typu Joda na pola daty / godziny bazy danych. JPA również może mieć na to odpowiedź.

Jeśli chcesz, aby Twoja aplikacja miała minimalną powierzchnię jako aplikacja komputerowa, ponieważ dotyczy miejsca na dysku, być może Java nie jest nawet właściwym wyborem języka.

wałek klonowy
źródło
Do Twojej wiadomości, projekt Joda-Time jest teraz w trybie konserwacji , a zespół doradza migrację do klas java.time . Zobacz samouczek Oracle .
Basil Bourque,
8

Jeszcze jeden punkt: Czas Java (tj. Date) Nie jest ThreadSafe, ale JodaTime jest. Dlatego JodaTime jest preferowane, gdy wymagają tego wymagania

  • Środowisko wielowątkowe uzyskujące dostęp do wspólnych zasobów
  • Scentralizowana synchronizacja czasu jak sytuacje

Albo w przypadku prostych aplikacji czas Java jest w porządku.

Vintesh
źródło
Nawet DateTime nie jest także ThreadSafe, prawda? Popraw mnie, jeśli się mylę.
vintesh
3
Zdecydowana większość biblioteki Joda, w tym klasa DateTime, jest niezmienna, a zatem bezpieczna dla wątków. Istnieje jednak kilka zmiennych, które nie są bezpieczne dla wątków. Zobacz joda-time.sourceforge.net/faq.html#threading .
Robert Johnson
1
Bezpieczeństwo wątków java.timejest realizowane poprzez niezmienność. Zobacz stackoverflow.com/questions/9303532/… . Działa to dobrze zarówno w przypadku prostych, jak i złożonych aplikacji. Nawet dokument api stwierdza, że ​​„Wszystkie klasy są niezmienne i bezpieczne dla wątków” (dosłownie zacytowane w drugim akapicie). Z java.utildrugiej strony stare klasy mają kilka problemów. Zdaję sobie sprawę, że ta odpowiedź odnosi się do tego drugiego, ale ważne jest, aby wprowadzić to rozróżnienie teraz.
YoYo
Nie reprezentowanie czasów jako niezmiennych wartości jest po prostu szalone. Wiem, że zostało to teraz naprawione, ale tak naprawdę, o czym oni myśleli?
Aluan Haddad
2

Java.time ramowa zastępuje obie klasy Date-Time starszych i Joda-Time

Aktualizacja: Stare klasy daty i czasu dostarczane z najwcześniejszymi wersjami Javy są teraz starsze, oficjalnie wyparte przez klasy java.time wbudowane w Javę 8, Java 9 i nowsze wersje .

Date, Calendar, SimpleDateFormat, A java.sql.*zajęcia date-time powinny być unikane. Nigdy nie ma potrzeby korzystania z tych mylących, kłopotliwych, źle zaprojektowanych klas. Są całkowicie zastąpione przez klasy java.time. Ich jedynym celem jest teraz utrzymanie istniejącego starego kodu. Podczas łączenia ze starym kodem można konwertować do / z java.time, wywołując nowe metody dodane do starych klas. Aby uzyskać więcej informacji na temat konwersji, zobacz: Konwertuj plik java.util.Date na jaki typ „java.time”? .

Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do klas java.time . Projekt Joda-Time zainspirował środowisko java.time. Obaj są prowadzeni przez tego samego mężczyznę, Stephena Colebourne . Możesz myśleć o java.time jako o przepisaniu / przeprojektowaniu Joda-Time, całkowicie nowym kodzie, ale wykorzystującym to, czego nauczyłem się przez lata od budowy pierwszej w branży kompleksowej i wyrafinowanej biblioteki dat i czasu.

Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień.

Duża część funkcji java.time została przeniesiona z powrotem do Java 6 i 7 w ThreeTen-Backport, a następnie dostosowana do Androida w ThreeTenABP (zobacz Jak korzystać… ).

Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval, YearWeek, YearQuarter, i więcej .

Basil Bourque
źródło