Unterschied zwischen Date-Klasse im Paket java.util & Paket java.sql
In java, sowohl die java.util
und die java.sql
Paket enthalten Date
Klasse, So was ist der Unterschied zwischen Ihnen?
Wenn man Date
Klasse ist in Java was ist dann die Notwendigkeit einer weiteren Date
Klasse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom die JavaDoc von
java.sql.Date
:Erklärung: Eine
java.util.Date
stellt Datum und Uhrzeit einjava.sql.Date
stellt nur ein Datum (das Gegenstück zu java.sql.Datumjava.sql.Zeit
, die, stellt nur eine Zeit des Tages, sondern erstreckt sich auchjava.util.Date
).Diese Antworten scheinen teilweise veraltet.
Gerade lese ich ein wenig API-Code (Java-Version 1.8.0_91) und fand diese in
java.sql.Date
:Die Methode für die Normalisierung der Zeit ist immer noch da und sogar der Kommentar sagt, dass die Zeit normiert auf 00:00:00 GMT aber es tut sich nix. Für einige Grund Sie entfernt die Normalisierung, das heißt, dass ein
java.sql.Date
enthält genau wie einjava.util.Date
nur die Anzahl der Millisekunden seit dem 1.1.1970 gewertet. So gibt es eine zeitliche Komponente, aber es wird nicht angezeigt, extern.Zum Beispiel der code
erzeugt die Ausgabe
Also seien Sie vorsichtig mit sql Daten und fassen Sie Sie nicht, wie Sie enthalten nur ein Datum und keine Zeit. Zum Beispiel:
Drucke:
Java.util.Datum ist der generische Allzweck-Date-Objekt. Es speichert ein Datum (wie lange) und ermöglicht es Ihnen, um es anzuzeigen.
java.sql.Date extends java.util.Datum. Hauptunterschied zu beachten ist, dass java.sql.Datum nicht über eine Zeit-Komponente.
Die Alten
java.util.Date
Den
java.util.Date
Klasse Teil das alte Datum-Zeit-Klassen, die haben sich schlecht entwickelt, verwirrend und lästig. Die Absicht ist es, stellen ein moment (ein Datum und ein Uhrzeit-des-Tages -) auf der Zeitachse.Die Klasse scheint einen moment in UTC, außer, dass seine
toString
Methode schweigend gilt die JVM die aktuelle Standard-Zeit-zone während der Erzeugung der Zeichenkette, die entsteht der Eindruck, dass eine java.util.Datum ist Zeit-zone, aber eigentlich nicht. Naja, eigentlich ist es hat haben Sie eine Zeitzone zugeordnet tief in seinen source code für irgendwas intern, aber nicht offensichtliche und nicht festgelegt noch get erreichbar. Ein verwirrendes Chaos.java.sql.Date
Den
java.sql.Date
macht eine schlechte situation noch schlimmer durch die Darstellung der a nur-Datum-Wert (wie ist das gemeint "DATUM" in der SQL-Datenbank der Welt), aber Tat so als "hack" durch die Erweiterungjava.util.Date
. Aber das sollen Sie so tun, es ist nicht eine Unterklasse, wie Regie in der Klasse von doc. Darüber hinaus hat sich time-of-Tag, aber vorgibt, nicht zu indem Sie sich der erste moment des Tages, in UTC. Ein verwirrendes Chaos.Und noch eins... die
java.sql.Date
- Klasse bietet auf einen Bruchteil der Sekunde mit einer Auflösung von Nanosekunden. Das geht über den Millisekunden Auflösung von java.util.Datum. Viele Datenbanken unterstützen feinere Auflösungen wie Mikrosekunde oder Nanosekunden.So, in dieser alten Datum-Zeit-Klassen es gibt keinen Weg, um wirklich repräsentieren eine nur-Datum-Wert mit keine-Zeit-von-Tag noch die Zeit-zone.
Die Neue
Den java.Zeit framework kommt zur Rettung. Inspiriert von der sehr erfolgreichen Joda-Time Projekt. Erbaut in Java 8 und höher. Zurück portiert auf Java 6 & 7, und weitere angepasst an Android. Sehen Oracle Tutorial.
Instant
Den
Instant
Klasse repräsentiert einen moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden. Klare und einfache.Wenn ein
java.util.Date
ist erforderlich für die Verwendung mit dem alten code, können Sie konvertieren. Finden Sie neue Methoden Hinzugefügt, um die alte Klasse: java.util.Datum::toInstant() und java.util.Datum.aus( Instant ).Zonen
Anpassen, in einigen örtlichen Wand-Uhr-Zeit, gelten ein offset von UTC (
ZoneOffset
), um eineOffsetDateTime
Objekt. Noch besser, wenn Sie wissen, die richtige Zeit-zone, name, gilt eineamp; zoneid
zu bekommenZonedDateTime
.Beispielsweise
Amerika/Montreal
ist vier Stunden hinter UTC im Sommer unter Daylight Saving Time (DST), so sehen wir, 10 PM (22:00) auf dem früheren Zeitpunkt in code unten anstatt 2 UHR in dem Beispiel oben. Zurück vier Stunden überquerte Mitternacht in der früheren Datum. Aber sowohl dieinstant
Objekt ist oben und diezdt
Objekt gesehen nächsten beide vertreten die gleichen gleichzeitiger moment auf der Zeitachse. Gleichen moment in der Geschichte, sondern "von morgen" in Paris, Kalkutta, und Auckland, während "gestern" in Montréal, Mexiko-Stadt und Honolulu.LocalDate
Für eine nur-Datum-Wert, verwenden Sie die
LocalDate
Klasse. Keine Zeit-von-Tag noch Zeit-zone beibehalten wird.Aber beachten Sie, dass eine Zeitzone ist entscheidend, ein Datum wie bei jedem gegebenen moment das Datum kann rund um den Globus variieren von time zone. Damit die Diskussion oben über die Angabe einer Zeitzone. Zum Beispiel, sehen Sie weiter, wie bekommen wir die 18 Juni statt der 19.
Wenn diese Unterscheidung zwischen Daten von time zone ist von Bedeutung, um Ihr Unternehmen, sollten Sie mit einem Datum-Zeit-Wert, gespeichert in einer Datenbank-Spalte-Typ des
TIMESTAMP WITH TIME ZONE
eher alsDATE
.Suche Stack Overflow für viel mehr Informationen und viele Beispiele von java.Zeit (tag:
java-time
).Datenbank
So speichern Sie die Datenbank, verwenden Sie eine JDBC Treiber Einhaltung JDBC 4.2 spec (siehe Guide). Rufen Sie
setObject
undgetObject
aufPreparedStatement
direkt mit dem java.Zeit-Objekte.Wenn Ihr JDBC-Treiber unterstützt noch keine solche direkte Nutzung von java.Zeit-Typen verwenden Sie die neue Methoden Hinzugefügt, um die alten Klassen zur Erleichterung der Umstellung. Aber minimieren Ihre Nutzung der alten Klassen; konvertieren in java.Zeit sofort und verwenden Sie nur java.Zeit, die Objekte in der business-Logik.
Und in die andere Richtung.
java.sql.Date akzeptiert ein long integer-Wert repräsentiert die Menge der Millisekunden seit dem 1. Januar 1970. Wenn die angegebene Zahl negativ ist, bezieht sich die Zeit vor dem 1. Januar 1970. Denken Sie daran, die gekapselten Wert in das Objekt stellt nur Datum wie der 1. Januar 1970 und keine Zeit-Informationen gespeichert sind.
java.util.Date speichert Datums-als auch Zeitinformationen.
Es wird häufiger verwendet als in java.sql.Datum.