JDBC Timestamp & Datum GMT Probleme

7

Ich habe eine JDBC-Datumsspalte, die, wenn ai getDate verwendet, den ' Datum ' Teil nur 02 Okt 2009 erhält, aber wenn ich getTimestamp verwende, bekomme ich den vollen ' Datum ' 02. Okt. 2009 13: 56: 78: 890 . Das ist genau das, was ich will.

Allerdings ignoriert das von getTimestamp zurückgegebene "Datum" die GMT-Werte, angenommen Datum; 02. Okt. 2009 13: 56: 78: 890 Ich werde am Ende 02 Oct 2009 15: 56: 78: 890

Mein Datum wurde als + 2GMT-Datum in der Datenbank gespeichert, aber der Anwendungsserver befindet sich auf GMT, d. h. 2 Stunden nach

Wie kann ich mein Date noch so erhalten? 02 Oct 2009 13: 56: 78: 890

Bearbeiten

Ich bekomme das Datum +2 auf der Clientseite, die auf GMT +2

ist     
n002213f 02.10.2009, 11:30
quelle

5 Antworten

12

Das ist der Unterschied zwischen Timestamp und anderen temporalen Typen in MySQL. Timestamp wird als Unix time_t in UTC gespeichert, aber andere Typen speichern Datum / Uhrzeit wörtlich ohne Zoneninformationen.

Wenn Sie getTimestamp () aufrufen, konvertiert der MySQL JDBC-Treiber die Zeit von GMT in die Standardzeitzone, wenn der Typ ein Zeitstempel ist. Es führt keine solche Konvertierung für andere Typen durch.

Sie können entweder den Spaltentyp ändern oder die Konvertierung selbst durchführen. Ich empfehle früheren Ansatz.

    
ZZ Coder 02.10.2009, 12:13
quelle
4

Sie sollten wissen, dass java.util.Date (und auch java.sql.Date und java.sql.Timestamp , die Unterklassen von java.util.Date sind) nichts über Zeitzonen wissen, oder vielmehr immer in UTC.

java.util.Date und seine Unterklassen sind nichts anderes als ein Container für eine "Anzahl von Millisekunden seit 01-01-1970, 12:00 AM UTC" -Wert.

Um ein Datum in einer bestimmten Zeitzone anzuzeigen, konvertieren Sie es in eine Zeichenfolge, indem Sie ein java.text.DateFormat -Objekt verwenden. Legen Sie die Zeitzone für dieses Objekt fest, indem Sie die Methode setTimeZone() aufrufen. Zum Beispiel:

%Vor%     
Jesper 02.10.2009 12:05
quelle
3

Ich stieß neulich auf ein ähnliches Problem, bei dem die Zeitkomponente von einigen Daten abgeschnitten wurde.

Wir haben es auf einen Unterschied in Oracle Driver-Versionen beschränkt.

In Oracle's FAQ gibt es einen Abschnitt dazu:

%Vor%

Vor 9201 wird Folgendes zurückgegeben:     getObject für sysdate: java.sql.Timestamp & lt; & lt; & lt; & lt;     getDate für sysdate: java.sql.Date     getTimetamp für sysdate: java.sql.Timestamp

Ab 9201 wird folgendes zurückgegeben:

getObject für sysdate: java.sql.Date & lt; & lt; & lt; & lt; & lt; getDate für sysdate: java.sql.Date & gt; & gt; Keine Änderung getTimetamp für sysdate: java.sql.Timestamp & gt; & gt; keine Änderung

Hinweis: java.sql.Date hat keinen Zeitabschnitt, während java.sql.Timestamp dies tut.

Mit dieser Änderung der Datatype-Zuordnung werden einige Anwendungen fehlschlagen und / oder falsche Ergebnisse generiert, wenn der JDBC-Treiber von 8i / 9iR1 auf 920x JBDC-Treiber aktualisiert wird. Um Kompatibilität zu erhalten und Anwendungen nach dem Upgrade funktionsfähig zu halten, wurde ein Kompatibilitäts-Flag bereitgestellt. Entwickler haben jetzt einige Optionen:

  1. Verwenden Sie das Attribut oracle.jdbc.V8Compatible.

Der JDBC-Treiber erkennt die Datenbankversion nicht standardmäßig. Um das Kompatibilitätsflag für die Verarbeitung von TIMESTAMP-Datentypen zu ändern, müssen Sie die Verbindungseigenschaft

verwenden

'oracle.jdbc.V8Compatible'

kann auf 'true' gesetzt werden, und der Treiber verhält sich in 8i, 901x, 9 200 (in Bezug auf TIMESTAMPs).

Standardmäßig ist das Flag auf 'false' gesetzt. Im OracleConnection-Konstruktor erhält der Treiber die Serverversion und setzt das Kompatibilitätsflag entsprechend.

%Vor%

Mit JDBC 10.1.0.x kann anstelle der Verbindungseigenschaft die folgende Systemeigenschaft verwendet werden: java -Doracle.jdbc.V8Compatible = true ..... Hinweis: Dieses Flag ist ein Nur-Client-Flag, das die Steuerung übernimmt die Zeitstempel- und Datumszuordnung. Es hat keine Auswirkungen auf Datenbankfunktionen.

'2. Verwenden Sie set / getDate und set / getTimestamp, wenn Sie den Datentyp der Date- und TimeStamp-Spalte entsprechend bearbeiten.

Der

9i-Server unterstützt die Spaltentypen Date und Timestamp. DATE ist java.sql.Date zugeordnet und TIMESTAMP ist java.sql.Timestamp zugeordnet.

Also für meine Situation hatte ich Code wie folgt:

%Vor%

Mit 9i bekam ich einen java.sql.Timestamp (was eine Unterklasse von java.util.Date ist), also war alles groovy und ich hatte meine Stunden und Minuten.

Aber mit 10g bekommt derselbe Code nun eine java.sql.Date (auch eine Unterklasse von java.util.Date, also kompiliert er immer noch), aber der HH: MM ist TRUNCATED !!.

Die zweite Lösung war ziemlich einfach für mich - ersetzen Sie einfach das getDate durch getTimestamp und Sie sollten in Ordnung sein. Ich denke, das war eine schlechte Angewohnheit.

    
Jim P 21.10.2009 20:51
quelle
0

Von diesem Beitrag bin ich zu dem Schluss gekommen, dass JDBC die Zeitzone für die Timestamp (Ich glaube nicht, dass MS SQL dies auch unterstützt, die meisten Google-Ergebnisse verweisen auf Oracle)

Wenn die JDBC getTimeStamp-Methode aufgerufen wird, ruft sie nur den 'Millisekunden Teil ab und erstellt ein Date-Objekt mit dem Server TimeZone, der GMT ist.

Wenn dieses Date-Objekt meinem Kunden präsentiert wird, was +2 GMT ist, addiert es 2 Stunden, was der Standard-Offset ist, der zu den zusätzlichen Stunden führt.

Ich habe das korrigiert, indem ich den Zeitversatz vom Datum, das ich abgerufen habe, entfernt habe, d. h. in das echte GMT-Datum umwandeln.

    
n002213f 02.10.2009 14:59
quelle
0
%Vor%     
Jayram 09.03.2013 13:33
quelle

Tags und Links