18.3.3 | Datum und Zeit |
Es herrscht oft große Verwirrung bei der Verwendung temporaler Typen in Java und JDBC. Das liegt zum einen an den verschiedenen Typen, die in der Datenbank für die Darstellung von Datum und Zeitangaben zur Verfügung stehen, aber auch an den Typen, die Java hierfür anbietet.
Java selbst stellt zum Umgang mit Datum und Zeit folgende Klassen bereit:Die Klasse java.util.Date besitzt zwar Methoden für die Umrechnung der Zeit in Kalendertage, diese stammen jedoch noch vom JDK 1.0 und sollten in neueren Anwendungen nicht benutzt werden, da sie über keinen Mechanismus zur Unterstützung von Kalender-Systemen verschiedener Nationalitäten verfügen. Im folgenden Beispiel wird ein Calender-Exemplar mit dem aktuellen Datum initialisiert und anschließend werden über die get()-Methode die spezifischen Daten extrahiert:
- java.util.Date
repräsentiert allgemein einen Zeitpunkt, gemessen in Millisekunden.- java.util.Calendar
wird für die Umrechnung eines konkreten Zeitpunktes in ein Kalender-System benutzt. Will man z. B. Tag, Monat und Jahr ermitteln, benötigt man ein Calendar-Exemplar zur Umrechung.Calendar cal = Calendar.getInstance(); cal.setTime(new java.util.Date()); cal.get(Calendar.DAY_OF_MONTH);Mit der Einführung von JDBC wurden folgende Typen eingeführt:Alle diese Klassen sind von java.util.Date abgeleitet und blenden jeweils die nicht benötigte Information aus. So enthalten z. B. Exemplare der Klasse java.sql.Date als Zeit immer den Wert 0.
- java.sql.Time
stellt eine Zeitangabe dar.- java.sql.Date
stellt eine Datumsangabe dar.- java.sql.TimeStamp
stellt eine Zeitangabe inklusive Datum dar.
Bei der Abfrage von temporalen Typen aus der Datenbank werden vom JDBC-Treiber immer Exemplare der entsprechenden Klassen aus dem Paket java.sql zurückgeliefert. Da sie alle von java.util.Date abgeleitet sind, kann man sie anschließend in der Client-Anwendung wie herkömmliche Exemplare dieser übergeordneten Klasse verwenden.
Bei der Speicherung temporaler Typen muss man allerdings beachten, dass diese Typen als Parameter nur mit vorbereiteten SQL-Anweisungen direkt gesetzt werden können. Exemplare vom Typ java.util.Date, die in der Anwendung erzeugt wurden, müssen vor der Speicherung in den entsprechenden temporalen Typ im Paket java.sql umgewandelt werden, wie folgendes Beispiel zeigt:Date d = new Date(); ... PreparedStatement prep; ... prep.setTimestamp(1, new java.sql.Date(d.getTime());