java.util.Date vs java.sql.Date

1. Übersicht

In diesem Tutorial werden zwei Datumsklassen verglichen: java.util.Date und java.sql.Date .

Sobald wir den Vergleich abgeschlossen haben, sollte klar sein, welches und warum zu verwenden ist.

2. java.util.Date

Die Klasse java.util.Date repräsentiert einen bestimmten Zeitpunkt mit einer Genauigkeit von Millisekunden seit dem 1. Januar 1970 00:00:00 GMT (der Epochenzeit) . Die Klasse wird verwendet, um die koordinierte Weltzeit (UTC) zu halten.

Wir können es auf zwei Arten initialisieren.

Durch Aufrufen des Konstruktors:

Date date = new Date();

Dadurch wird ein neues Datumsobjekt erstellt, dessen Uhrzeit auf die aktuelle Uhrzeit eingestellt ist und auf die nächste Millisekunde gemessen wird.

Oder indem Sie einige Millisekunden seit der Epoche vergehen:

long timestamp = 1532516399000; // 25 July 2018 10:59:59 UTC Date date = new Date(timestamp);

Beachten Sie, dass andere Konstruktoren, die vor Java 8 vorhanden waren, jetzt veraltet sind.

Allerdings Datum hat eine Reihe von Fragen und insgesamt seine Verwendung wird nicht mehr empfohlen .

Es ist veränderlich. Sobald wir es initialisiert haben, können wir seinen internen Wert ändern. Zum Beispiel können wir die setTime- Methode aufrufen :

date.setTime(0); // 01 January 1970 00:00:00

Weitere Informationen zu den Vorteilen unveränderlicher Objekte finden Sie in diesem Artikel: Unveränderliche Objekte in Java.

Es werden auch nicht alle Daten sehr gut verarbeitet. Technisch sollte es die koordinierte Weltzeit (UTC) widerspiegeln. Dies hängt jedoch von einem Betriebssystem der Host-Umgebung ab.

Die meisten modernen Betriebssysteme verwenden 1 Tag = 24h x 60m x 60s = 86400 Sekunden, was, wie wir sehen können, die "Schaltsekunde" nicht berücksichtigt.

Mit der Einführung von Java 8 sollte das Paket java.time verwendet werden . Vor Java 8 war eine alternative Lösung verfügbar - Joda Time .

3. java.sql.Date

Das java.sql.Date erweitert die java.util.Date- Klasse.

Der Hauptzweck ist die Darstellung von SQL DATE, das Jahre, Monate und Tage enthält. Es werden keine Zeitdaten gespeichert.

Tatsächlich wird das Datum seit dem 1. Januar 1970 um 00:00:00 GMT als Millisekunden gespeichert und der Zeitteil wird normalisiert, dh auf Null gesetzt.

Grundsätzlich handelt es sich um einen Wrapper um java.util.Date , der SQL-spezifische Anforderungen behandelt. java.sql.Date sollte nur beim Umgang mit Datenbanken verwendet werden.

Da java.sql.Date jedoch keine Zeitzoneninformationen enthält, hängt die Zeitzonenkonvertierung zwischen unserer lokalen Umgebung und dem Datenbankserver von der Implementierung des JDBC-Treibers ab. Dies erhöht die Komplexität zusätzlich.

Beachten Sie abschließend, dass zur Unterstützung anderer SQL-Datentypen: SQL TIME und SQL TIMESTAMP zwei weitere java.sql- Klassen verfügbar sind: Time und Timestamp .

Letzteres unterstützt Nanosekunden , obwohl es sich von java.util.Date aus erstreckt .

4. Fazit

Die Klasse java.util.Date speichert einen Datums- / Uhrzeitwert als Millisekunden seit der Epoche. java.sql.Date speichert nur einen Datumswert und wird häufig in JDBC verwendet.

Der Umgang mit Daten ist schwierig. Wir müssen uns an Sonderfälle erinnern: Schaltsekunden , verschiedene Zeitzonen usw. Beim Umgang mit JDBC können wir java.sql.Date mit Vorsicht verwenden.

Wenn wir java.util.Date verwenden wollen, müssen wir uns an seine Mängel erinnern. Wenn Sie Java 8 verwenden, ist es besser, java.util.Date überhaupt nicht zu verwenden .