Czy powinienem używać klas daty i godziny Java, czy też korzystać z biblioteki innej firmy, takiej jak Joda Time?

147

Tworzę system internetowy, który będzie używany w krajach na całym świecie. Jednym z typów danych, które muszą być przechowywane, są daty i godziny.

Jakie są zalety i wady używania klas daty i czasu Java w porównaniu z bibliotekami innych firm, takimi jak czas Joda ? Wydaje mi się, że te biblioteki innych firm istnieją nie bez powodu, ale nigdy tak naprawdę ich nie porównywałem.

JodaStephen
źródło
5
Aby wyjaśnić kilka komentarzy… Podczas gdy Joda-Time kontynuuje, jego następca JSR 310: Date and Time API jest rzeczywiście zaplanowany jako część Java 8 w pakiecie java.time . Oracle ma szkic samouczka . JDBC 4.2 będzie obsługiwać nowe typy danych.
Basil Bourque

Odpowiedzi:

197

EDYCJA: Teraz, gdy Java 8 została wydana, jeśli możesz tego użyć, zrób to! java.timemoim zdaniem jest jeszcze czystszy niż Joda Time. Jeśli jednak utkniesz przed Java-8, czytaj dalej ...

Max zapytał o zalety i wady używania Jody ...

Plusy:

  • Pracuje bardzo dobrze. Podejrzewam, że w Jodzie jest znacznie mniej błędów niż standardowe biblioteki Java. Niektóre błędy w bibliotekach Java są naprawdę trudne (jeśli nie niemożliwe) do naprawienia ze względu na projekt.
  • Został zaprojektowany, aby zachęcić Cię do zastanowienia się nad obsługą daty / godziny we właściwy sposób - oddzielając pojęcie „czasu lokalnego” (np. „Obudź mnie o 7 rano, gdziekolwiek jestem”) i moment w czasie („Dzwonię do Jamesa o 15:00 czasu PST; tam, gdzie on jest, może nie być 15:00, ale to ta sama chwila ”)
  • Wierzę, że to sprawia, że łatwiejsze do aktualizacji bazy danych strefy czasowej, która robi zmiany stosunkowo często
  • Ma dobrą historię niezmienności, która znacznie ułatwia życie IME.
  • Prowadząc od niezmienności, wszystkie elementy formatujące są bezpieczne dla wątków, co jest świetne, ponieważ prawie zawsze chcesz ponownie użyć jednego programu formatującego za pośrednictwem aplikacji
  • Będziesz miał przewagę w nauce java.timew Javie 8, ponieważ są one przynajmniej trochę podobne

Cons:

  • To kolejny interfejs API do nauczenia (chociaż dokumentacja jest całkiem dobra)
  • To kolejna biblioteka do budowania i wdrażania
  • Jeśli korzystasz z języka Java 8, nadal musisz wykonać migrację swoich umiejętności
  • W DateTimeZoneBuilderprzeszłości nie udało mi się skutecznie wykorzystać tego . Jest to jednak bardzo rzadki przypadek użycia.

Aby odpowiedzieć na pomysł oxbow_lakes, aby skutecznie zbudować własne małe API, oto moje poglądy na temat tego, dlaczego jest to zły pomysł:

  • To jest praca. Po co pracować, skoro zostało już zrobione za Ciebie?
  • Nowicjusz w Twoim zespole jest bardziej zaznajomiony z Jodą niż z Twoim własnym interfejsem API
  • Prawdopodobnie popełnisz błąd w przypadku czegokolwiek poza najprostszymi zastosowaniami ... i nawet jeśli początkowo myślisz, że potrzebujesz tylko prostej funkcjonalności, te rzeczy mają zwyczaj stawać się coraz bardziej skomplikowane, po trochu na raz. Manipulacja datą i godziną jest trudna do wykonania. Ponadto wbudowane interfejsy API Java są trudne w użyciu - wystarczy spojrzeć na reguły dotyczące działania arytmetyki interfejsu API kalendarza. Tworzenie czegokolwiek na wierzchu jest złym pomysłem, zamiast używać na początek dobrze zaprojektowanej biblioteki.
Jon Skeet
źródło
5
@adi: Zaktualizowano - jest nadal ważny, ale mam nadzieję , że JSR-310 będzie częścią Java 8, ale nie był częścią Java 7.
Jon Skeet
2
@JonSkeet Prawdopodobnie powinno to zostać zaktualizowane od czasu wprowadzenia java-8
Sionnach733
@ Sionnach733: Nie będę aktualizować tego wszystkiego, ale dodam coś na początku.
Jon Skeet
2
Istnieje backport java.time.*dla Java 6 i 7: threeten.org/threetenbp
Miscreant
24

Cóż, jeśli nie zamierzasz czekać na Java 8, mając nadzieję, że zaimplementują lepsze API do manipulowania datą i godziną, tak, proszę, użyj Joda-Time . To oszczędność czasu i uniknięcie wielu bólów głowy.

gadżet
źródło
Plusy i minusy? Nigdy nie wykorzystywałem czasu Jody - byłoby interesujące usłyszeć, co ludzie w nim lubią.
Max Stewart
15

Odpowiedź brzmi: to zależy

JODA (i JSR-310) to w pełni funkcjonalna biblioteka daty / czasu, obejmująca obsługę wielu systemów kalendarzy.

Osobiście uważam, że JODA jest o krok za daleko, jeśli chodzi o złożoność tego, czego potrzebuję. 2 główne błędy (IMHO) w standardowej Javie Datei Calendarklasach to:

  1. Są zmienne
  2. Łączą koncepcję roku-miesiąca-dnia z chwilą-czasu

Chociaż zajmuje się nimi JODA, łatwo będzie Ci rzucić własne klasy dla YearMonthDayi Instant, które używają klas java pod maską do rzeczywistych obliczeń „kalendarzowych”. Nie musisz wtedy zapoznawać się z API składającym się z> 100 klas, innym mechanizmem formatowania / parsowania itp.

Oczywiście, jeśli potrzebujesz pełnej reprezentacji różnych chronologii (np. Hebrajskiej) lub chcesz mieć możliwość zdefiniowania własnego wyimaginowanego systemu kalendarza (np. Dla gry, którą piszesz), być może JODA lub JRS-310 jest dla Ciebie. Jeśli nie, to sugeruję, że prawdopodobnie najlepszym rozwiązaniem jest skręcenie własnego.

Liderem specyfikacji JSR-310 jest Stephen Colebourne, który napisał JODĘ na pierwszym miejscu, więc logicznie zastąpi JODĘ.

oxbow_lakes
źródło
16
nie powinny być odkrywane na nowo przez osoby niebędące specjalistami, IMO.
Jon Skeet
6
Nie jestem kretynem, ale nadal mam problemy z interfejsami API Java D&T. Są boleśnie łatwe do niewłaściwego użycia. Powodem, dla którego ludzie są bardziej skłonni do prawidłowego korzystania z Jody, jest to, że Joda jest lepiej zaprojektowana - zachęca cię do robienia właściwych rzeczy.
Jon Skeet
6
Ufam ekspertowi w każdym dniu tygodnia, jeśli chodzi o interfejsy API daty / czasu. To nie jest tak, że jest to przypadkowy interfejs API innej firmy, z którego nikt inny nie korzysta. Argument „> 100 klas” jest słomkowy, ponieważ oczywiście nie musisz uczyć się ich wszystkich.
Jon Skeet
5
Myślę, że będziemy musieli zgodzić się na różnice. Każda godna zaufania data / godzina napisana przez ekspertów i dobrze zaprojektowana, dzięki której nie muszę wykonywać brudnej roboty z liczeniem czasu, liczy się z mojego punktu widzenia jako „must have”. W ciągu ostatniego roku nauczyłem się z pasją nienawidzić mierzenia czasu ludzkiego.
Jon Skeet
5
Robienie własnego, gdy Joda istnieje, to po prostu okropny pomysł. Po prostu tego nie rób. To prawda, że ​​Joda ma dziesiątki klas, z których nie będziesz korzystać, ale odpowiedź na to jest dość prosta - nie korzystaj z tych, których nie potrzebujesz. Jest tak wiele rzeczy, które mogą się nie udać podczas pisania własnej biblioteki tego typu - nakład pracy, który będziesz musiał włożyć, jest ogromny, zarówno podczas programowania, jak i testowania. Możesz też po prostu dodać jedną bibliotekę. Ponadto Joda ma tę dodatkową zaletę, że nowi rekruci w Twoim zespole mogli z niego korzystać wcześniej, ale nie korzystali z Twojej własnej biblioteki.
Dawood ibn Kareem
7

Wszystko zależy od tego, co robisz z datami. Jeśli po prostu je utrwalasz, daty wbudowane w Javę prawdopodobnie zrobią wszystko, co chcesz. Jeśli jednak robisz obszerne manipulowanie datą czasową, prawdopodobnie lepiej będzie z Jodą.

Anthony Roy
źródło
7

Powinieneś użyć biblioteki Joda-Time, ponieważ:

  1. Joda-Time obsługuje standard ISO 8601 , który jest standardowym sposobem
    przedstawiania daty.
  2. Dodawanie i odejmowanie dnia / miesiąca / roku jest łatwiejsze w Joda-Time niż java.util.date.
  3. Inicjalizacja według podanej daty jest o wiele łatwiejsza w Joda-Time.
  4. Joda-Time obsługuje również strefę czasową.
  5. Joda-Time ma lepsze wbudowane parsowanie. Błędna data, np. „2014-02-31”, jest zgłaszana jako błąd:Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

Możesz polubić tę stronę, aby uzyskać więcej informacji: http://swcodes.blogspot.com/

Gość
źródło