web-dev-qa-db-de.com

Unterschiede zwischen Java 8 Date Time API (Java.time) und Joda-Time

Ich weiß, dass es Fragen zu Java.util.Date und Joda-Time gibt. Aber nach einigem Graben konnte ich keinen Thread über die Unterschiede zwischen der Java.time-API finden (neu in Java 8 , definiert durch JSR 310 und Joda-Time .

Ich habe gehört, dass die Java.time-API von Java 8 viel sauberer ist und viel mehr kann als Joda-Time. Aber ich kann keine Beispiele finden, die die beiden vergleichen.

  • Was kann Java.time, was Joda-Time nicht kann?
  • Was kann Java.time besser als Joda-Time?
  • Ist die Leistung mit Java.time besser?
252
Zack

Gemeinsame Funktionen

a) Beide Bibliotheken verwenden unveränderliche Typen. Joda-Time bietet auch zusätzliche veränderbare Typen wie MutableDateTime an.

b) Außerdem: Beide Bibliotheken sind inspiriert von der Designstudie "TimeAndMoney" von Eric Evans oder Ideen von Martin Fowler über domänengetriebenen Stil und streben mehr oder weniger nach einer - fließender Programmierstil (obwohl nicht immer perfekt ;-)).

c) Mit beiden Bibliotheken erhalten wir einen realen Kalenderdatentyp (genannt LocalDate), einen realen Wandzeittyp (genannt LocalTime) und die Komposition (genannt LocalDateTime). Das ist ein sehr großer Gewinn im Vergleich zu alten Java.util.Calendar Und Java.util.Date.

d) Beide Bibliotheken verwenden einen methodenzentrierten Ansatz, dh sie ermutigen den Benutzer, getDayOfYear() anstelle von get(DAY_OF_YEAR) zu verwenden. Dies verursacht eine Menge zusätzlicher Methoden im Vergleich zu Java.util.Calendar (Obwohl letztere wegen übermäßigem Gebrauch von Ints überhaupt nicht typsicher sind).

Leistung

Siehe die andere Antwort von @ OO7, die auf die Analyse von Michail Woronzow verweist, obwohl Punkt 3 (Ausnahme Fang) wahrscheinlich veraltet ist - siehe dieser JDK-Bug . Die unterschiedliche Leistung (die im Allgemeinen zugunsten von JSR-31 ist) beruht hauptsächlich auf der Tatsache, dass die interne Implementierung von Joda-Time immer maschinenzeitähnlich ist lang-primitiv (in Millisekunden).

Null

Joda-Time verwendet häufig NULL als Standard für die Systemzeitzone, das Standardgebietsschema, den aktuellen Zeitstempel usw., während JSR-310 fast immer NULL-Werte zurückweist.

Präzision

JSR-310 verarbeitet die Genauigkeit Nanosekunde , während die Joda-Zeit auf Millisekunde begrenzt ist.

Unterstützte Felder:

Eine Übersicht über unterstützte Felder in Java-8 (JSR-310) geben einige Klassen im temporal-Paket (zum Beispiel ChronoField und WeekFields ), während Joda-Time ist ziemlich schwach in diesem Bereich - siehe DateTimeFieldType . Der größte Mangel an Joda-Time ist hier das Fehlen lokalisierter wochenbezogener Felder. Beiden Feldimplementierungsentwürfen ist gemeinsam, dass sie auf Werten des Typs long basieren (keine anderen Typen, nicht einmal Aufzählungen).

Aufzählung

JSR-310 bietet Aufzählungen wie DayOfWeek oder Month, während Joda-Time dies nicht anbietet, da es hauptsächlich in den Jahren 2002-2004 vor Java) entwickelt wurde 5 .

Zonen-API

a) JSR-310 bietet mehr Zeitzonenfunktionen als Joda-Time. Letzteres kann keinen programmgesteuerten Zugriff auf die Historie der Zeitzonen-Offset-Übergänge gewähren, während JSR-310 dies kann.

b) Zu Ihrer Information: JSR-310 hat sein internes Zeitzonen-Repository an einen neuen Speicherort und in ein anderes Format verschoben. Der alte Bibliotheksordner lib/zi existiert nicht mehr.

Einsteller vs. Eigentum

JSR-310 hat die TemporalAdjuster-Schnittstelle eingeführt, um zeitliche Berechnungen und Manipulationen zu externalisieren. Insbesondere für Bibliotheks- oder Framework-Autoren ist dies eine nette und relativ einfache Möglichkeit, neue Erweiterungen von JSR-310 einzubetten Art Äquivalent zu statischen Hilfsklassen für frühere Java.util.Date).

Für die meisten Benutzer hat diese Funktion jedoch nur einen sehr begrenzten Wert, da die Belastung zum Schreiben von Code immer noch beim Benutzer liegt. Eingebaute Lösungen, die auf dem neuen TemporalAdjuster - Konzept basieren, sind nicht so zahlreich. Derzeit gibt es nur die Hilfsklasse TemporalAdjusters mit einer begrenzten Anzahl von Manipulationen (und den Aufzählungen Month oder andere zeitliche Typen).

Joda-Time bietet ein Feldpaket an, aber die Praxis hat gezeigt, dass neue Feldimplementierungen sehr schwer zu codieren sind. Auf der anderen Seite bietet Joda-Time sogenannte Eigenschaften, die einige Manipulationen wesentlich einfacher und eleganter machen als in JSR-310, zum Beispiel property.withMaximumValue () .

Kalendersysteme

JSR-310 bietet 4 zusätzliche Kalendersysteme. Das interessanteste ist malqura (wird in Saudi-Arabien verwendet). Die anderen 3 sind: Minguo (Taiwan), Japanisch (nur der moderne Kalender seit 1871!) Und ThaiBuddhist (nur korrekt nach 1940).

Joda-Time bietet einen islamischen Kalender basierend auf einer Berechnungsgrundlage - nicht einen auf Sichtungen basierenden Kalender wie Umalqura. Thai-Buddhist wird auch von Joda-Time in ähnlicher Form angeboten, Minguo und Japan nicht. Ansonsten bietet Joda-Time auch koptischen und äthiopischen Kalender an (jedoch ohne Unterstützung für die Internationalisierung).

Interessanter für Europäer: Joda-Time bietet auch einen gregorianisch , julianisch und einen gemischt-gregorianisch-julianischen Kalender an. Der praktische Wert für reale historische Berechnungen ist jedoch begrenzt, da wichtige Merkmale wie unterschiedliche Jahresstarts in der Datumsgeschichte überhaupt nicht unterstützt werden (die gleiche Kritik gilt für alte Java.util.GregorianCalendar).

Andere Kalender wie Hebräisch oder Persisch oder Hind fehlen in beiden Bibliotheken vollständig.

Epochen

JSR-310 hat die Klasse JulianFields , während Joda-Time (Version 2.0) einige Hilfsmethoden in der Klasse DateTimeUtils anbietet.

Uhren

JSR-310 hat keine Schnittstelle (ein Designfehler), sondern eine abstrakte Klasse Java.time.Clock, Die für jede Taktabhängigkeitsinjektion verwendet werden kann. Joda-Time bietet stattdessen die Schnittstelle MillisProvider und einige Hilfsmethoden in DateTimeUtils an. Auf diese Weise ist Joda-Time auch in der Lage, testgetriebene Modelle mit unterschiedlichen Uhren (Verspottung usw.) zu unterstützen.

Dauer Arithmetik

Beide Bibliotheken unterstützen die Berechnung von Zeitabständen in einer oder mehreren Zeiteinheiten. Bei der Verarbeitung von Zeiträumen mit nur einer Einheit ist der JSR-310-Stil natürlich besser (und basiert auf Long-Werten, anstatt int zu verwenden):

JSR-310 => long days = ChronoUnit.DAYS.between(date1, date2);

Joda-Zeit => int days = DAYS.daysBetween(date1, date2).getDays();

Die Behandlung von Zeiträumen mit mehreren Einheiten ist ebenfalls unterschiedlich. Sogar die Berechnungsergebnisse können abweichen - siehe dies geschlossen Joda-Time-Ausgabe . Während JSR-310 einen sehr einfachen und begrenzten Ansatz verwendet, um nur die Klassen Period (Dauer basierend auf Jahren, Monaten und Tagen) und Duration (basierend auf Sekunden und Nanosekunden) zu verwenden, verwendet Joda-Time verwendet eine differenziertere Methode unter Verwendung der Klasse PeriodType, um zu steuern, in welchen Einheiten eine Dauer (Joda-Zeit nennt es "Periode") ausgedrückt werden soll. Während die PeriodType- API irgendwie umständlich zu bedienen ist, wird eine ähnliche Möglichkeit von JSR-310 überhaupt nicht angeboten. Insbesondere ist es in JSR-310 noch nicht möglich, gemischte Datums- und Zeitdauern zu definieren (zum Beispiel basierend auf Tagen und Stunden). Seien Sie also gewarnt, wenn es um die Migration von einer Bibliothek zu einer anderen geht. Die diskutierten Bibliotheken sind - trotz teilweise gleicher Klassennamen - nicht kompatibel.

Intervalle

JSR-310 unterstützt diese Funktion nicht, während Joda-Time nur eingeschränkte Unterstützung bietet. Siehe auch diese SO-Antwort .

Formatieren und Parsen

Am besten vergleichen Sie beide Bibliotheken, indem Sie die gleichnamigen Klassen DateTimeFormatterBuilder (JSR-310) und DateTimeFormatterBuilder (Joda-Time) anzeigen. Die JSR-310-Variante ist etwas leistungsfähiger (kann auch jede Art von TemporalField verarbeiten, vorausgesetzt, der Feldimplementierer hat es geschafft, einige Erweiterungspunkte wie resolve () ) zu codieren. Wichtigster Unterschied ist jedoch - meiner Meinung nach:

JSR-310 kann Zeitzonennamen (Formatmustersymbol z) viel besser analysieren, während Joda-Time dies in früheren Versionen überhaupt nicht und nur sehr eingeschränkt konnte.

Ein weiterer Vorteil von JSR-310 ist die Unterstützung von eigenständigen Monatsnamen, die für Sprachen wie Russisch oder Polnisch usw. wichtig sind. Joda-Time hat keinen Zugriff auf solche Ressourcen - nicht einmal auf Java-8-Plattformen.

Die Mustersyntax in JSR-310 ist auch flexibler als in Joda-Time, ermöglicht optionale Abschnitte (mit eckigen Klammern), orientiert sich stärker am CLDR-Standard und bietet Auffüllmöglichkeiten (Buchstabensymbol p) und mehr Felder.

Ansonsten sollte beachtet werden, dass Joda-Time die Dauer mit PeriodFormatter formatieren kann. JSR-310 kann das nicht.


Hoffe diese Übersicht hilft. Alle gesammelten Informationen sind hauptsächlich auf meine Bemühungen und Untersuchungen zurückzuführen, wie eine bessere Datums- und Zeitbibliothek entworfen und implementiert werden kann (nichts ist perfekt).

Update vom 24.06.2015:

Inzwischen habe ich die Zeit gefunden, zu schreiben und eine tabellarische Übersicht zu veröffentlichen für verschiedene Zeitbibliotheken in Java. Die Tabellen enthalten auch einen Vergleich zwischen Joda-Time v2.8.1 und Java-8 (JSR-310). Es ist detaillierter als dieser Beitrag.

398
Meno Hochschild

Java 8 Datum/Uhrzeit:

  1. Java 8-Klassen basieren auf der menschlichen Zeit. Es macht sie schnell für die menschliche Arithmetik/Konvertierung von Datum und Uhrzeit.
  2. Datums-/Zeitkomponenten-Getter wie getDayOfMonth haben O(1) Komplexität in der Java 8-Implementierung.
  3. Das Parsen von OffsetDateTime/OffsetTime/ZonedDateTime ist in Java 8 ea b121 sehr langsam, da Ausnahmen ausgelöst und intern im JDK abgefangen wurden.
  4. Eine Reihe von Paketen: Java.time.*, Java.time.chrono.*, Java.time.format.*, Java.time.temporal.*, Java.time.zone.*
  5. Zeitpunkte (Zeitstempel) Datum und Uhrzeit Teilweise Parser und Formatierer für Datum und Uhrzeit Zeitzonen Unterschiedliche Chronologien (Kalender).
  6. Bestehende Klassen haben Probleme wie Datum hat keine Unterstützung für I18N oder L10N. Sie sind veränderlich!
  7. Einfacher und robuster.
  8. Uhren können eingespritzt werden.
  9. Uhren können mit verschiedenen Eigenschaften erstellt werden - statische Uhren, verspottete Uhren, Uhren mit geringer Genauigkeit (ganze Sekunden, ganze Minuten usw.).
  10. Uhren können mit bestimmten Zeitzonen erstellt werden. Clock.system(Zone.of("America/Los_Angeles")).
  11. Macht das Datum und die Uhrzeit der Codebehandlung testbar.
  12. Macht Tests unabhängig von der Zeitzone.

Joda-Zeit:

  1. Joda-Time nutzt die Maschinenzeit im Inneren. Eine manuelle Implementierung basierend auf int/long-Werten wäre viel schneller.
  2. Joda-Time-Getter erfordern die Zeitberechnung von Computer zu Mensch bei jedem Getter-Aufruf, was Joda-Time in solchen Szenarien zu einem Engpass macht.
  3. Es besteht aus unveränderlichen Klassen, die Instants, Date & Time, Partials und Durations verarbeiten. Es ist flexibel. Es ist gut gestaltet.
  4. Stellt Daten als Zeitpunkte dar. Ein Datum und eine Uhrzeit können jedoch mehr als einem Zeitpunkt entsprechen. Überlappungszeit, wenn die Sommerzeit endet. Sowie keinen Moment haben, der ihm überhaupt entspricht. Zwischenstunde bei Tagesanbruch. Muss für einfache Operationen komplexe Berechnungen durchführen.
  5. Akzeptiert bei den meisten Methoden Nullen als gültige Werte. Führt zu subtilen Fehlern.

Für einen genaueren Vergleich siehe: -

Java 8 Date/Time Library Performance (sowie Joda-Time 2.3 und j.u.Calendar) . & Neue Datums- und Uhrzeit-API in Java 8

41
OO7