Sollte ich Java-Datums- und Zeitklassen verwenden oder eine Bibliothek eines Drittanbieters wie Joda Time verwenden?

147

Ich erstelle ein webbasiertes System, das in Ländern aus der ganzen Welt eingesetzt wird. Eine Art von Daten, die gespeichert werden müssen, sind Datum und Uhrzeit.

Was sind die Vor- und Nachteile der Verwendung der Java-Datums- und Zeitklassen im Vergleich zu Bibliotheken von Drittanbietern wie Joda time ? Ich denke, diese Bibliotheken von Drittanbietern existieren aus gutem Grund, aber ich habe sie selbst nie wirklich verglichen.

JodaStephen
quelle
5
Um einige Kommentare zu verdeutlichen… Während Joda-Time fortfährt, ist geplant, dass sein Nachfolger JSR 310: Date and Time API tatsächlich Teil von Java 8 unter dem Paket java.time ist . Oracle hat einen Entwurf eines Tutorials . JDBC 4.2 behandelt die neuen Datentypen.
Basil Bourque

Antworten:

197

EDIT: Jetzt, da Java 8 veröffentlicht wurde, tun Sie dies, wenn Sie das verwenden können! java.timeist meiner Meinung nach sogar sauberer als Joda Time. Wenn Sie jedoch vor Java-8 nicht weiterkommen, lesen Sie weiter ...

Max fragte nach den Vor- und Nachteilen der Verwendung von Joda ...

Vorteile:

  • Es funktioniert sehr gut. Ich vermute sehr, dass es in Joda weit weniger Fehler gibt als in den Standard-Java-Bibliotheken. Einige der Fehler in den Java-Bibliotheken sind aufgrund des Designs sehr schwer (wenn nicht unmöglich) zu beheben.
  • Es soll Sie dazu ermutigen, über Datums- / Uhrzeitbehandlung richtig nachzudenken - das Konzept einer "Ortszeit" (z. B. "Weck mich um 7 Uhr morgens, wo immer ich bin") und eines Augenblicks ("Ich rufe James an" zu trennen) um 15 Uhr PST, es ist vielleicht nicht 15 Uhr, wo er ist, aber es ist der gleiche Moment ")
  • Ich glaube, es macht es einfacher, die Zeitzonendatenbank zu aktualisieren, die sich relativ häufig ändert
  • Es hat eine gute Unveränderlichkeitsgeschichte, die das Leben IME viel einfacher macht .
  • Aufgrund der Unveränderlichkeit sind alle Formatierer threadsicher. Dies ist großartig, da Sie fast immer einen einzelnen Formatierer über die Anwendung wiederverwenden möchten
  • Sie haben einen Vorsprung beim Lernen java.timein Java 8, da diese zumindest etwas ähnlich sind

Nachteile:

  • Es ist eine weitere API zu lernen (obwohl die Dokumente ziemlich gut sind)
  • Es ist eine weitere Bibliothek, gegen die gebaut und bereitgestellt werden kann
  • Wenn Sie Java 8 verwenden, müssen Sie noch einige Fähigkeiten migrieren
  • Ich habe das DateTimeZoneBuilderin der Vergangenheit nicht effektiv genutzt. Dies ist jedoch ein sehr seltener Anwendungsfall.

Um auf die Idee von oxbow_lakes zu reagieren, effektiv eine eigene kleine API zu erstellen, sind hier meine Ansichten, warum dies eine schlechte Idee ist:

  • Es ist Arbeit. Warum arbeiten, wenn es bereits für Sie erledigt wurde?
  • Ein Neuling in Ihrem Team ist mit Joda viel eher vertraut als mit Ihrer selbst erstellten API
  • Sie werden es wahrscheinlich für alles falsch machen, was über die einfachsten Verwendungszwecke hinausgeht ... und selbst wenn Sie anfänglich denken, dass Sie nur einfache Funktionen benötigen, haben diese Dinge die Angewohnheit, immer kleiner zu werden. Die Manipulation von Datum und Uhrzeit ist schwierig . Darüber hinaus sind die integrierten Java-APIs nur schwer ordnungsgemäß zu verwenden. Sehen Sie sich einfach die Regeln für die Funktionsweise der Datums- / Uhrzeit-Arithmetik der Kalender-API an. Es ist eine schlechte Idee, etwas darüber aufzubauen, anstatt zunächst eine gut gestaltete Bibliothek zu verwenden.
Jon Skeet
quelle
5
@adi: Aktualisiert - es ist noch gültig, aber hoffentlich wird JSR-310 Teil von Java 8 sein, aber es war nicht Teil von Java 7.
Jon Skeet
2
@ JonSkeet Dies sollte wahrscheinlich seit der Einführung von Java-8
Sionnach733
@ Sionnach733: Ich werde nicht alles aktualisieren, aber ich werde am Anfang etwas hinzufügen.
Jon Skeet
2
Es gibt einen Backport java.time.*für Java 6 und 7: threeten.org/threetenbp
Miscreant
24

Nun, es sei denn, Sie möchten auf Java 8 warten, in der Hoffnung, dass eine bessere API zum Bearbeiten von Datum und Uhrzeit implementiert wird. Ja, bitte verwenden Sie Joda-Time . Es ist zeitsparend und vermeidet viele Kopfschmerzen.

Gizmo
quelle
Vor-und Nachteile? Ich habe noch nie Joda-Zeit genutzt - wäre interessant zu hören, was die Leute daran mögen.
Max Stewart
15

Die Antwort lautet: es kommt darauf an

JODA (und JSR-310) ist eine voll funktionsfähige Datums- / Zeitbibliothek, einschließlich Unterstützung für die Verwendung mit mehreren Kalendersystemen.

Persönlich empfand ich JODA als einen Schritt zu weit in Bezug auf die Komplexität für das, was ich brauche. Die 2 Hauptfehler (IMHO) in Standard-Java Dateund Calendar-Klassen sind:

  1. Sie sind veränderlich
  2. Sie verwechseln das Konzept eines Jahr-Monat-Tages mit einem Sofort-in-Time

Obwohl diese von JODA angesprochen werden, ist es ziemlich einfach, eigene Klassen für YearMonthDayund zu rollen Instant, die beide die Java-Klassen unter der Haube für tatsächliche "kalendarische" Berechnungen verwenden. Dann müssen Sie sich nicht mit einer API von> 100 Klassen, einem anderen Formatierungs- / Parsing-Mechanismus usw. vertraut machen.

Wenn Sie eine vollständige Darstellung verschiedener Chronologien benötigen (z. B. Hebräisch) oder Ihr eigenes imaginäres Kalendersystem definieren möchten (z. B. für ein Spiel, das Sie schreiben), ist JODA oder JRS-310 möglicherweise das Richtige für Sie. Wenn nicht, dann würde ich vorschlagen, dass das Rollen Ihrer eigenen möglicherweise der richtige Weg ist.

Der JSR-310-Spezifikationsleiter ist Stephen Colebourne, der JODA an erster Stelle geschrieben hat und daher JODA logisch ersetzen wird.

oxbow_lakes
quelle
16
sollte nicht von Nichtfachleuten neu erfunden werden, IMO.
Jon Skeet
6
Ich bin auch kein Idiot, aber ich hatte immer noch Probleme mit den Java D & T APIs. Sie sind schmerzlich leicht zu missbrauchen. Der Grund, warum Menschen Joda mit größerer Wahrscheinlichkeit richtig verwenden können, ist, dass Joda besser gestaltet ist - es ermutigt Sie, das Richtige zu tun.
Jon Skeet
6
Ich vertraue einem Experten an jedem Wochentag, wenn es um Datums- / Zeit-APIs geht. Es ist nicht so, dass dies eine zufällige API von Drittanbietern ist, die von niemand anderem verwendet wird. Das Argument "> 100 Klassen" ist ein Strohmann, weil Sie offensichtlich nicht alle lernen müssen.
Jon Skeet
5
Ich denke, wir müssen zustimmen, um uns zu unterscheiden. Jedes vertrauenswürdige Datum und jede vertrauenswürdige Uhrzeit, die von Experten geschrieben und gut gestaltet wurden und die es mir ersparen, schmutzige Arbeit mit Zeitangaben zu verrichten, gelten aus meiner Sicht als "Muss". Im letzten Jahr habe ich gelernt, die menschliche Zeitmessung mit Leidenschaft zu hassen.
Jon Skeet
5
Es ist einfach eine schreckliche Idee, sich selbst zu rollen, wenn Joda existiert. Tu es einfach nicht. Es ist wahr, dass Joda Dutzende von Klassen hat, die Sie nicht verwenden werden, aber die Antwort darauf ist ganz einfach - verwenden Sie nicht die, die Sie nicht benötigen. Es gibt so viele Dinge, die beim Schreiben einer eigenen Bibliothek dieses Typs schief gehen können - der Aufwand, den Sie investieren müssen, ist enorm, sowohl bei der Entwicklung als auch beim Testen. Oder Sie können einfach eine Bibliothek hinzufügen. Dann hat Joda den zusätzlichen Vorteil, dass neue Mitarbeiter Ihres Teams es möglicherweise schon einmal verwendet haben, aber Ihre eigene Bibliothek nicht verwendet haben.
Dawood ibn Kareem
7

Es hängt alles davon ab, was Sie mit den Daten machen. Wenn Sie sie einfach beibehalten, werden die in Java integrierten Daten wahrscheinlich alles tun, was Sie möchten. Wenn Sie jedoch umfangreiche Manipulationen am Zeitdatum durchführen, sind Sie mit Joda wahrscheinlich besser dran.

Anthony Roy
quelle
7

Sie sollten eine Joda-Time-Bibliothek verwenden, weil:

  1. Joda-Time unterstützt den ISO 8601-Standard , eine Standardmethode zur
    Datumsdarstellung.
  2. Das Hinzufügen und Subtrahieren eines Tages / Monats / Jahres ist in Joda-Time einfacher als in java.util.date.
  3. Eine Initialisierung durch ein bestimmtes Datum ist in Joda-Time so viel einfacher.
  4. Joda-Time unterstützt auch die Zeitzone.
  5. Joda-Time verfügt über eine besser integrierte Analyse. Ein falsches Datum wie "2014-02-31" wird als Fehler ausgegeben:Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

Diese Seite könnte Ihnen für weitere Details gefallen: http://swcodes.blogspot.com/

Gast
quelle