Joda Time gegen Java Time

19

Obwohl Joda reich an Funktionen und ausgefeilter als die Standard-Java-Zeit ist, ist es möglicherweise nicht immer die beste Wahl. Wie entscheide ich, ob ich Joda Time oder Java Time in einem Java-Code verwenden soll?

Gibt es eine Richtlinie, die uns sagt, wie wir die richtige für unsere Anforderungen auswählen können?

Jedi Ritter
quelle
5
Nutzen Sie das Beste aus beiden Welten mit der neuen Datums- und Uhrzeit-API in Java 8 . Es ist stark von Joda Time beeinflusst. In der Tat ist der Hauptautor Stephen Colebourne, der Autor von Joda Time.
Joachim Sauer
1
@JoachimSauer Wurde es in einer endgültigen Version veröffentlicht oder wird dies geschehen, wenn Java 8 gestartet wird?
m3th0dman
@ m3th0dman: Es wird in der endgültigen Java 8-Version enthalten sein. Es wurde noch nicht veröffentlicht. GA ist derzeit für den 09.09.2013 geplant .
Joachim Sauer
Sowohl die Joda-Time-Klasse als auch die ursprüngliche Java-Date-Time-Klasse sind jetzt von den in Java 8, Java 9 und höher integrierten java.time- Klassen veraltet .
Basil Bourque

Antworten:

29

Joda Time ist eine solche Verbesserung gegenüber der Java-Zeitbibliothek, dass es mit Ausnahme der folgenden Ausnahmen fast immer die richtige Wahl ist:

  1. Wenn es schwierig oder unerwünscht ist, Abhängigkeiten von Drittanbietern zu Ihrem Projekt hinzuzufügen

  2. Wenn die Verwendung in einer öffentlichen Schnittstelle zu Problemen führen würde, z. B. wenn ein ORM sowohl Java- als auch Joda-Zeitfelder verarbeiten soll

Bei 2) ist es jedoch besser, wenn möglich, Joda intern zu verwenden.

Die oben genannten Dinge sind zu beachten, sollten aber selten sein. Wenn Sie Zweifel haben, gehen Sie mit Joda.

Robert Johnson
quelle
Sagen Sie mir bitte, was "Joda intern verwenden" bedeutet. Ich bin ein Anfänger und kenne all diese Dinge nicht.
Jedi Knight
5
@Jedi Knight: Dies bedeutet, dass die Anwendung Joda für ihre eigene Logik verwendet und nur zu / von java.util.Date konvertiert, wenn sie mit einem externen System kommuniziert, das dies erfordert.
Michael Borgwardt
2
Mit 'intern' kann es für die gesamte Anwendung intern sein (wie in Michaels Beispiel), aber es kann auch für eine Klasse oder nur für eine bestimmte Methode intern sein. Angenommen, Sie haben eine Dienstprogrammmethode, die zwei Java-Datumsobjekte verwendet und die Anzahl der Arbeitstage zwischen ihnen berechnet, die jedoch einen Fehler enthält. Um das Problem zu beheben, ist es möglicherweise einfacher, diese Methode mit JodaTime neu zu schreiben, aber Sie können sich möglicherweise nicht die Zeit nehmen, den gesamten Code, der die Methode aufruft, neu zu faktorisieren, sodass Sie die Methodensignatur unverändert lassen. In diesem Fall verwenden Sie Joda "intern" in dieser Methode.
Robert Johnson
Zu Ihrer Information , das Joda-Time- Projekt befindet sich jetzt im Wartungsmodus , und das Team rät zur Migration in die java.time- Klassen. Siehe Tutorial von Oracle .
Basil Bourque
13

Beachten Sie, dass auf der Joda-Time- Website Folgendes angegeben ist:

Die Standardklassen für Datum und Uhrzeit vor Java SE 8 sind schlecht. Indem Joda-Time dieses Problem direkt angeht, ist es de facto zur Standardbibliothek für Datum und Uhrzeit in Java geworden. Beachten Sie, dass Benutzer ab Java SE 8 aufgefordert werden, zu java.time (JSR-310) zu migrieren.

Der Hauptverantwortliche für Joda-Time , jodastephen , ist auch der Hauptverantwortliche für JSR-310, wie im GitHub-Repository zu sehen ist, das mit http://www.threeten.org/ verknüpft ist . By the way, jodastephen hat auch einen SO Griff ...

Ich denke, wir können mit der neuen Datums- und Uhrzeit-API, die ab Java 8 verfügbar ist, beruhigt und sicher sein .

Einige zusätzliche Referenzen:

YoYo
quelle
12

Die Java-Standard-Datums-API ist so grundlegend fehlerhaft, dass ich oft überlegt habe, einfach Joda Time zu den Bibliothekserweiterungen der JVM hinzuzufügen, damit sie standardmäßig mit dem Rest der Java-API in den Klassenpfad geladen wird.

Wenn Sie jemals mit der Nachrüstung von Internationalisierung und Zeitzonen in einer älteren Java-Anwendung beauftragt wurden und versucht haben, nur die Standard-Java-API zu verwenden, werden Sie verstehen, was ich meine. Ich konnte Tausende von Codezeilen in weniger als hundert umwandeln. Der Produktivitätsschub ist unvorstellbar.

Darüber hinaus ist die Standard-Datums-API nicht intuitiv, da die flüssige Joda-API in Stunden und nicht in Wochen abgerufen werden kann. Ihre Analogie, wie Sie versuchen, auf die drei Kilometer entfernte Insel zu gelangen, ähnelt der folgenden.

1) Ein Motorboot, das Sie in nur 6 Minuten zur Insel bringt.

Oder...

2) Ein behelfsmäßiges Bambusfloß, das während eines Hurrikans, der von einem verrückten Kerl gesteuert wird, dessen bester Freund ein Volleyball ist, mit Weinstöcken zusammengebunden wurde.

Wie in anderen Antworten bereits festgestellt wurde, treten die wenigen Nachteile wie der ORM nicht mehr auf, da Hibernate jetzt Plugins enthält, mit denen Joda-Typ-Bean-Eigenschaften Datenbank-Datums- / Zeitfeldern zugeordnet werden können. JPA könnte auch eine Antwort darauf haben.

Wenn Sie möchten, dass Ihre Anwendung als Desktop-Anwendung einen minimalistischen Platzbedarf aufweist, da sie sich auf den Festplattenspeicher bezieht, ist Java möglicherweise nicht einmal die richtige Sprache.

maple_shaft
quelle
Zu Ihrer Information , das Joda-Time- Projekt befindet sich jetzt im Wartungsmodus , und das Team rät zur Migration in die java.time- Klassen. Siehe Tutorial von Oracle .
Basil Bourque
8

Ein weiterer Punkt: Java-Time (dh Date) ist nicht ThreadSafe, sondern JodaTime. So wird JodaTime bevorzugt, wenn Anforderungen wie

  • MultiThreaded-Umgebung, die auf die gemeinsamen Ressourcen zugreift
  • Zentrale Zeitsynchronisation wie Situationen

Oder für einfache Anwendungen ist Java-Time in Ordnung.

vintesh
quelle
Auch DateTime ist nicht ThreadSafe, nicht wahr? Korrigiere mich, wenn ich falsch liege.
Vintesh
3
Die überwiegende Mehrheit der Joda-Bibliothek, einschließlich der DateTime-Klasse, ist unveränderlich und daher threadsicher. Es gibt jedoch einige veränderbare Klassen, die nicht threadsicher sind. Siehe joda-time.sourceforge.net/faq.html#threading .
Robert Johnson
1
Die Thread-Sicherheit für java.timewird durch Unveränderlichkeit implementiert. Siehe stackoverflow.com/questions/9303532/… . Dies funktioniert sowohl für einfache als auch für komplexe Anwendungen. Sogar das API-Dokument gibt an, dass "alle Klassen unveränderlich und threadsicher sind" (wörtlich aus dem zweiten Absatz zitiert). Die alten java.utilKlassen haben dagegen mehrere Probleme. Mir ist klar, dass sich diese Antwort auf letztere bezieht, aber es ist jetzt wichtig, diese Unterscheidung zu treffen.
YoYo
Datumszeiten nicht als unveränderliche Werte darzustellen ist einfach verrückt. Ich weiß, es ist jetzt behoben, aber was in aller Welt dachten sie?
Aluan Haddad
2

Das java.time- Framework ersetzt sowohl ältere Datums- und Uhrzeitklassen als auch Joda-Time

Update: Die alten Datums- / Uhrzeitklassen, die mit den frühesten Versionen von Java ausgeliefert wurden, sind jetzt veraltet und werden offiziell durch die in Java 8, Java 9 und höher integrierten java.time-Klassen ersetzt .

Date, Calendar, SimpleDateFormatUnd die java.sql.*Datum-Zeit - Klassen alle sollen vermieden werden. Es besteht nie die Notwendigkeit, diese verwirrenden, lästigen und schlecht designten Klassen zu verwenden. Sie werden vollständig durch java.time-Klassen ersetzt. Ihr einziger Zweck ist jetzt die Pflege des vorhandenen alten Codes. Wenn Sie mit altem Code arbeiten, können Sie zu / von java.time konvertieren, indem Sie neue Methoden aufrufen, die den alten Klassen hinzugefügt wurden. Weitere Informationen zum Konvertieren finden Sie unter: Konvertieren von java.util.Date in den Typ "java.time". .

Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den java.time- Klassen. Das Joda-Time-Projekt hat das java.time-Framework inspiriert. Beide werden von demselben Mann geführt, Stephen Colebourne . Sie können sich java.time als ein Umschreiben / Neugestalten von Joda-Time vorstellen. Dabei handelt es sich um neuen Code, bei dem jedoch das verwendet wird, was im Laufe der Jahre aus der Erstellung der ersten umfassenden und ausgefeilten Date-Time-Bibliothek der Branche gelernt wurde.

Weitere Informationen finden Sie im Oracle-Tutorial . Durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen.

Ein Großteil der java.time-Funktionalität wird in ThreeTen-Backport auf Java 6 & 7 zurückportiert und in ThreeTenABP auf Android angepasst (siehe Verwendung… ).

Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval, YearWeek, YearQuarter, und mehr .

Basil Bourque
quelle