2009-10-02 7 views
7

ich einen JDBC-Spalte Datum haben, die, wenn ai verwenden getDate ist das ‚Datum‘ Teil nur 2. Oktober 2009 bekommen, aber wenn ich getTimestamp verwenden bekomme ich die volle ‚Datum02 Okt 2009 13: 56: 78: 890. Das ist genau das, was ich will.JDBC Timestamp & Date GMT gibt

Allerdings ignoriert das von getTimestamp zurückgegebene 'Datum' die GMT-Werte, angenommen Datum; 2. Oktober 2009 13: 56: 78: 890, am Ende i 2. Oktober 2009 15 bekommen: 56: 78: 890

wurde Mein Datum als + 2GMT Datum in der Datenbank gespeichert, aber der Anwendungsserver ist auf GMT dh 2 Stunden hinter

wie kann immer noch mein Datum erhalten wie sie ist, 2. Oktober 2009 13: 56: 78: 890

bearbeiten

ich das Datum +2 auf der Client-Seite erhalten, ist auf GMT +2

Antwort

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. Für andere Typen wird keine Konvertierung durchgeführt.

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

+0

Stichwort ** ** wandelt, weshalb ich die 2 Stunden bekommen – n002213f

+0

Ich bin verwirrt, ist, wenn Umwandlung richtig funktioniert, sollte er nicht ein Datum zu sehen, dass 2 Stunden weniger, statt mehr ? – wds

+0

@wds - überprüfen Sie meine Bearbeitung und Antwort – n002213f

4

Sie sollten sich bewusst sein, dass java.util.Date (und auch java.sql.Date und java.sql.Timestamp, die Subklassen von java.util.Date sind) wissen nichts über Zeitzonen, oder besser gesagt, sie sind immer in UTC.

java.util.Date und seine Unterklassen sind nichts anderes als ein Container für einen "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 Objekt java.text.DateFormat verwenden. Legen Sie die Zeitzone für dieses Objekt fest, indem Sie die Methode setTimeZone() aufrufen. Zum Beispiel:

Date date = ...; // wherever you get this from 

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

// Make the date format show the date in CET (central European time) 
df.setTimeZone(TimeZone.getTimeZone("CET")); 

String text = df.format(date); 
0

Von diesen post Ich bin zu dem Schluss gekommen, dass JDBC die Zeitzone macht abrufen für den Zeitstempel (Ich glaube nicht, MS SQL-Unterstützung dies auch, die meisten Google-Ergebnisse zu Oracle-Punkt)

Wenn die JDBC getTimestamp Methode heißt es erhält nur die 'Millisekunden' Teil und erstellen Sie ein Date-Objekt mit dem Server TimeZone, die GMT ist.

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

Ich habe dies korrigiert, indem ich den Zeitversatz von dem Datum, das ich abrufe, entferne, d. H. Zum echten GMT-Datum umwandeln.

3

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

Wir haben es auf einen Unterschied in Oracle Driver-Versionen eingegrenzt.

Auf Oracle FAQ es einen Abschnitt über dieses ist:


select sysdate from dual; ...while(rs.next()) 

Vor 9201, wird dies zurück: getObject für sysdate: java.sql.Timestamp < < < < getDate für sysdate : java.sql.Date getTimetamp für sysdate: java.sql.Timestamp

Ab 9201 wird das folgende ret urned

getObject für sysdate: java.sql.Date < < < < < getDate für sysdate: java.sql.Date >> keine Änderung getTimetamp für sysdate: java.sql.Timestamp >> keine Änderung

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

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

  1. Verwenden Sie oracle.jdbc.V8Compatible Flag.

JDBC-Treiber nicht Datenbank-Version standardmäßig erfassen. Um die Kompatibilitätsflag Änderungszeitmarke für den Umgang mit Datentypen, Verbindungseigenschaft

‚oracle.jdbc.V8Compatible‘

kann auf ‚true‘ gesetzt werden, und der Fahrer verhält, wie es in 8i erzogene, 901x, 9 200 (mit 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äts-Flag entsprechend.

java.util.Properties prop=newjava.util.Properties(); 
prop.put("oracle.jdbc.V8Compatible","true"); 
prop.put("user","scott"); 
prop.put("password","tiger"); 
String url="jdbc:oracle:thin:@host:port:sid"; 
Connection conn = DriverManager.getConnection(url,prop); 

Mit JDBC 10.1.0.x kann die folgende Systemeigenschaft kann anstelle der Verbindungseigenschaft verwendet: java -Doracle.jdbc.V8Compatible = true ..... Hinweis: Dieses Flag ist ein Client Nur Flag, das die Timestamp- und Date-Zuordnung steuert. Es betrifft keine Datenbankfunktion.

'2. Verwenden Sie "set/getDate" und "set/getTimestamp", wenn Sie den Datentypen "Date" und "TimeStamp" entsprechend behandeln.

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


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

import java.util.Date; 
Date d = rs.getDate(1); 

Mit 9i Ich war immer ein java.sql.Timestamp (die eine Unterklasse von java.util.Date ist) so alles war groovy und ich hatte meine Stunden und Minuten.

Aber mit 10g, der gleiche Code bekommt jetzt eine java.sql.Date (auch eine Unterklasse von java.util.Date, so dass es noch kompiliert), aber die HH: MM ist TRUNCATED !!.

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

+0

danke für diesen einen Jim, am meisten geschätzt. – n002213f

0
private Date convertDate(Date date1) throws ParseException { 
     SimpleDateFormat sdfFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     String dateStr = sdfFormatter.format(date1); 
     SimpleDateFormat sdfParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     sdfParser.setTimeZone(TimeZone.getTimeZone("GMT")); 
     return sdfParser.parse(dateStr); 
    }