Java-MySQL-Timestamp Zeit-zone Probleme
Ich habe eine java.util.Date
Objekt, und ich brauche, um es einzufügen in ein datetime-Feld in MySQL in UTC
- format.
java.util.Date date = myDateFromSomewhereElse;
PreparedStatement prep = con.prepareStatement(
"INSERT INTO table (t1, t2) VALUES (?,?)");
java.sql.Timestamp t = new Timestamp(date.getTime());
prep.setTimestamp(1, t, Calendar.getInstance(TimeZone.getTimeZone("PST"));
prep.setTimestamp(2, t, Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(prep.toString());
Gibt mir die vorbereitete SQL-Anweisung-Zeichenfolge:
INSERT INTO table (t1, t2) VALUES ('2012-05-09 11:37:08','2012-05-09 11:37:08');
Den timestamp zurückgegeben, ist der gleiche Zeitstempel unabhängig von der Zeitzone angeben. Es ignoriert die Kalender-Objekt mit Zeitzone, die ich angeben. Was ist Los und was mache ich falsch?
Zeitzonen nicht ändern den Zeitstempel. Sie wechseln nur das, was gezeigt wird, wenn das Datum dargestellt wird.
Ja, ich verstehe, dass ein timestamp ist nur eine Zahl von Millisekunden seit der Epoche in GMT, unabhängig von der Zeitzone. Mein problem ist, dass auch durch die Angabe der Zeitzone, Darstellung der exakt gleichen Datum anzuzeigen (siehe dass obwohl ich angegeben verschiedenen Zeitzonen, Datum erbracht wurde genau das gleiche in der letzten SQL-Befehl).
Ich denke, dies kann sein, was du suchst : puretech.paawak.com/2010/11/02/...
Ja, ich verstehe, dass ein timestamp ist nur eine Zahl von Millisekunden seit der Epoche in GMT, unabhängig von der Zeitzone. Mein problem ist, dass auch durch die Angabe der Zeitzone, Darstellung der exakt gleichen Datum anzuzeigen (siehe dass obwohl ich angegeben verschiedenen Zeitzonen, Datum erbracht wurde genau das gleiche in der letzten SQL-Befehl).
Ich denke, dies kann sein, was du suchst : puretech.paawak.com/2010/11/02/...
InformationsquelleAutor Jordan | 2012-05-09
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zeitzonen sind nur verschiedene Möglichkeiten zum anzeigen eines Datums (das ist ein fester Punkt in der Zeit). Ich schrieb ein kleines Beispiel hier (achten Sie auf das behaupten):
Die Ausgabe dieses snippets ist (das Ergebnis wird unterschiedlich sein, je nach Ausführung Datum/Uhrzeit):
Dein snippet in der Frage ist einfach nichts zu tun, mit Rücksicht auf das Datum gespeichert wird. In der Regel Datenbanken konfiguriert sind, für einen einheitlichen Zeitzone. Ich rate die Speicherung ein extra Feld in Vertretung der Zeitzone verwendet werden, die bei der Interpretation des Datums.
Ist es nicht (generell) eine gute Idee zu ändern, Termine (die sind im wesentlichen nur Millisekunden vor/nach einem festen Punkt in der Zeit), als wäre dies eine verlustbehaftete änderung würde unterschiedlich interpretiert werden zu verschiedenen Zeitpunkten im Jahr (aufgrund der Sommerzeit).
Oder so : http://puretech.paawak.com/2010/11/02/how-to-handle-oracle-timestamp-with-timezone-from-java/
TIMESTAMP WITH TIME ZONE
. Aber wo ist keine Unterstützung von Zeitzonen für Termine in MySQL.Ja, ich lege einen link unten für eine Oracle-spezifische Implementierung zum speichern/abrufen von Zeitzonen zusammen mit dem die Termine. Ich denke, dass es mehr generische speichern, um die Zeitzone, die separat, wie es macht es mehr tragbar für nicht-Oracle-Datenbanken. Die große Sache über Termine auch ohne Zeitzone Kontext ist, dass Sie im Vergleich zueinander, ohne Probleme.
Wenn Sie wirklich brauchen, um zu bestehen Zeit-zone info, es ist besser, verwenden Sie Datenbank-spezifische Funktion (wie in Oracle und PostgreSQL) und vergessen Sie die Portabilität. Sonst haben Sie problem mit Vergleich und Sortierung.
Sie sind falsch über Probleme mit der Sortierung, wenn nicht die Verwendung von Datenbank-spezifischen Zeitzone features. Termine/Zeiten werden gespeichert als festen Punkt in der Zeit Ganzzahlen (die Zeit vor oder nach einem festen Punkt in der Zeit). Als solche, können Sie sich immer sortiert, verglichen und vollkommen ohne Verständnis für die Zeitzone, die Sie vertreten.
Ja, du hast mich hier. Hatte nicht gedacht, über diese Möglichkeit. +1 zu kommentieren.
InformationsquelleAutor Chris
Jordan, tatsächlich, Sie hatten die richtige Idee. Das problem ist, es gibt einen bug in der MySQL-JDBC-Treiber und den Kalender argument ist völlig standardmäßig ignoriert. Blick auf den Quellcode für PreparedStatement, um zu sehen, was wirklich Los ist.
Bemerken format der Zeitstempel mit der JVM-Zeitzone. Dies wird nur funktionieren, wenn Sie in der JVM-ist die Verwendung der UTC-Zeitzone. Der Kalender Objekt wird vollständig ignoriert.
Um MySQL verwenden Sie den Kalender argument, Sie müssen deaktivieren Sie die legacy-Datum/Uhrzeit-code, mit dem folgenden Anschluss option:
So könnte man es verwenden, wenn eine Verbindung zu der Datenbank wie diese:
Wenn Sie deaktivieren Sie die legacy-datetime-code mit der obigen Zeile, dann WIRD es dazu führen, dass Ihre Zeitstempel in der target-Kalender-Zeitzone:
Es ist ziemlich einfach, um zu sehen, was hier Los ist. Wenn Sie ein Kalender-Objekt verwenden, wird dies bei der Formatierung der Daten. Ansonsten wird die Datenbank ist Zeit-zone, um die Formatierung der Daten. Seltsamerweise, wenn Sie einen Kalender, es wird auch die Zeit eingestellt, die zu dem gegebenen Timestamp-Wert (scheinbar sinnlos).
InformationsquelleAutor nogridbag
Überprüfen dieser link für die Erklärung für MySQL (und man sollte nicht versuchen, Tipps zu Oracle, MySQL).
InformationsquelleAutor Vadim Ponomarev