Die Date Time API ist eines der größten Features des Java 8 Releases. Java fehlte von Anfang an ein konsistenter Ansatz für Datum und Uhrzeit, und die Java 8 Date Time API ist eine willkommene Ergänzung zu den Kern-Java-APIs.
Warum brauchen wir eine neue Java Date Time API?
Bevor wir uns die Java 8 Date Time API ansehen, lassen Sie uns sehen, warum wir eine neue API dafür brauchen. Es gab mehrere Probleme mit den vorhandenen Datum- und Zeitklassen in Java, einige davon sind:
- Java-Datum-Zeit-Klassen sind nicht konsistent definiert, wir haben die Date-Klasse sowohl in den Paketen java.util als auch java.sql. Wiederum sind Formatierungs- und Parse-Klassen im Paket java.text definiert.
- java.util.Date enthält sowohl Datum als auch Uhrzeitwerte, während java.sql.Date nur Datumswerte enthält. Dass dies im java.sql-Paket liegt, ergibt keinen Sinn. Außerdem haben beide Klassen denselben Namen, was an sich ein sehr schlechtes Design ist.
- Es gibt keine klar definierten Klassen für Zeit, Zeitstempel, Formatierung und Parsing. Wir haben die abstrakte Klasse java.text.DateFormat für Parsing- und Formatierungsbedürfnisse. Üblicherweise wird die Klasse SimpleDateFormat für Parsing und Formatierung verwendet.
- Alle Datumsklassen sind veränderlich, daher sind sie nicht thread-sicher. Dies ist eines der größten Probleme mit den Java-Datum- und Kalenderklassen.
- Die Klasse Date bietet keine Internationalisierung und keine Unterstützung für Zeitzonen. Daher wurden die Klassen java.util.Calendar und java.util.TimeZone eingeführt, aber sie haben auch alle oben aufgeführten Probleme.
Es gibt einige weitere Probleme mit den Methoden, die in den Klassen Date und Calendar definiert sind, aber die oben genannten Probleme zeigen deutlich, dass eine robuste Date-Time-API in Java benötigt wurde. Deshalb spielte Joda Time eine entscheidende Rolle als hochwertiger Ersatz für die Java Date-Time-Anforderungen.
Java 8 Date-Time-Designprinzipien
Die Java 8 Date-Time-API ist eine Implementierung von JSR-310. Sie ist darauf ausgelegt, alle Mängel in den veralteten Date-Time-Implementierungen zu überwinden. Einige der Designprinzipien der neuen Date-Time-API sind:
-
Unveränderlichkeit: Alle Klassen in der neuen Date-Time-API sind unveränderlich und gut für Mehrfadenumgebungen.
-
Trennung von Anliegen: Die neue API trennt klar zwischen menschenlesbarer Datum/Uhrzeit und maschinenlesbarer Zeit (Unix-Zeitstempel). Sie definiert separate Klassen für Datum, Uhrzeit, Datum/Uhrzeit, Zeitstempel, Zeitzonen usw.
-
Klarheit: Die Methoden sind klar definiert und führen in allen Klassen dieselbe Aktion aus. Zum Beispiel gibt es die Methode jetzt(), um die aktuelle Instanz zu erhalten. Es gibt format() und parse() Methoden in all diesen Klassen, anstatt eine separate Klasse dafür zu haben.
Alle Klassen verwenden das Factory-Muster und das Strategie-Muster zur besseren Handhabung. Nachdem Sie die Methoden in einer der Klassen verwendet haben, wird die Arbeit mit anderen Klassen nicht schwer sein.
-
Dienstprogrammbetrieb: Alle neuen Date-Time-API-Klassen verfügen über Methoden zur Ausführung gängiger Aufgaben wie Plus, Minus, Formatieren, Parsen, Abrufen des separaten Teils in Datum/Uhrzeit usw.
-
Erweiterbar: Die neue Date-Time-API funktioniert im ISO-8601-Kalendersystem, aber wir können sie auch mit anderen nicht-ISO-Kalendern verwenden.
Date-Time-API-Pakete
Die Java 8 Date-Time-API besteht aus folgenden Paketen.
- java.time: Dies ist das Basismodul der neuen Java-Date-Time-API. Alle wichtigen Basisklassen gehören zu diesem Paket, wie LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration usw. Alle diese Klassen sind unveränderlich und threadsicher. In den meisten Fällen werden diese Klassen für die Bearbeitung gängiger Anforderungen ausreichen.
- java.time.chrono: Dieses Paket definiert generische APIs für nicht-ISO-Kalendersysteme. Wir können die Klasse AbstractChronology erweitern, um unser eigenes Kalendersystem zu erstellen.
- java.time.format: Dieses Paket enthält Klassen, die zur Formatierung und zum Parsen von Datum-Zeit-Objekten verwendet werden. In den meisten Fällen verwenden wir sie nicht direkt, da die Hauptklassen im java.time-Paket Formatierung und Parse-Methoden bereitstellen.
- java.time.temporal: Dieses Paket enthält temporäre Objekte, die wir verwenden können, um spezifische Daten oder Zeiten im Zusammenhang mit Datum-/Zeitobjekten herauszufinden. Zum Beispiel können wir diese verwenden, um den ersten oder letzten Tag des Monats herauszufinden. Sie können diese Methoden leicht identifizieren, weil sie immer das Format „withXXX“ haben.
- Paket java.time.zone: Dieses Paket enthält Klassen zur Unterstützung verschiedener Zeitzonen und ihrer Regeln.
Beispiele für Java 8 Datum-Zeit-API-Klassen
Wir haben uns die wichtigsten Teile der Java-Datum-Zeit-API angesehen. Es ist jetzt an der Zeit, sich die wichtigsten Klassen der Datum-Zeit-API mit Beispielen anzusehen.
1. LocalDate
LocalDate ist eine unveränderliche Klasse, die ein Datum im Standardformat JJJJ-MM-TT darstellt. Wir können die Methode now() verwenden, um das aktuelle Datum zu erhalten. Wir können auch Eingabeargumente für Jahr, Monat und Tag bereitstellen, um eine LocalDate-Instanz zu erstellen.
Diese Klasse bietet eine überladene Methode für now(), bei der wir ZoneId übergeben können, um Daten in einer bestimmten Zeitzone zu erhalten. Diese Klasse bietet die gleiche Funktionalität wie java.sql.Date.
Die Erklärung der LocalDate-Methoden ist in den Kommentaren enthalten. Wenn wir dieses Programm ausführen, erhalten wir die folgende Ausgabe.
2. LocalTime
LocalTime ist eine unveränderliche Klasse, deren Instanz eine Zeit im menschenlesbaren Format darstellt. Ihr Standardformat ist hh:mm:ss.zzz. Genau wie LocalDate bietet diese Klasse Unterstützung für Zeitzonen und die Erstellung einer Instanz durch Übergeben von Stunde, Minute und Sekunde als Eingabeargumente.
Ausgabe:
3. LocalDateTime
LocalDateTime ist ein unveränderliches Datum-Zeit-Objekt, das ein Datum und eine Uhrzeit mit dem Standardformat yyyy-MM-dd-HH-mm-ss.zzz darstellt. Es bietet eine Factory-Methode, die LocalDate- und LocalTime-Eingabeargumente akzeptiert, um eine LocalDateTime-Instanz zu erstellen.
In allen drei Beispielen haben wir gesehen, dass bei der Bereitstellung ungültiger Argumente zum Erstellen von Datum/Uhrzeit eine java.time.DateTimeException ausgelöst wird, die eine RuntimeException ist, sodass wir sie nicht explizit abfangen müssen.
Wir haben auch festgestellt, dass wir Datum-/Uhrzeitdaten erhalten können, indem wir ZoneId übergeben. Sie können die Liste der unterstützten ZoneId-Werte aus ihrer Java-Dokumentation erhalten. Wenn wir die obige Klasse ausführen, erhalten wir die folgende Ausgabe.
4. Instant
Die Instant-Klasse wird verwendet, um mit einem maschinenlesbaren Zeitformat zu arbeiten. Instant speichert Datum und Uhrzeit im Unix-Zeitstempelformat.
Ausgabe:
Java 8-Datums-API-Dienstprogramme
Die meisten der Prinzipklassen für Datum und Uhrzeit bieten verschiedene Hilfsmethoden wie Plus/Minus Tage, Wochen, Monate usw. Es gibt einige andere Hilfsmethoden zum Anpassen des Datums mithilfe von TemporalAdjuster
und zum Berechnen des Zeitraums zwischen zwei Daten.
Output:
Java 8 Datum Parsen und Formatieren
Es ist sehr üblich, ein Datum in verschiedene Formate zu formatieren und dann einen String zu parsen, um die Datum-Zeit-Objekte zu erhalten.
Output:
Java-Datums-API Legacy-Datum-Zeit-Unterstützung
Legacy-Datum-/Zeit-Klassen werden in fast allen Anwendungen verwendet, daher ist eine Rückwärtskompatibilität ein Muss. Deshalb gibt es mehrere Hilfsmethoden, mit denen wir Legacy-Klassen in neue Klassen und umgekehrt konvertieren können.
Output:
Wie Sie sehen können, sind die toString()-Methoden der Legacy-Klassen TimeZone
und GregorianCalendar
zu umfangreich und nicht benutzerfreundlich.
Fazit
I like this new Date Time API a lot. Some of the most used classes will be LocalDate and LocalDateTime. It’s very easy to work with the new classes. And, having similar methods that does a particular job makes it easy to find. It will take some time from moving legacy classes to new Date Time classes, but I believe it will be worth the time and effort.
Source:
https://www.digitalocean.com/community/tutorials/java-8-date-localdate-localdatetime-instant