2009-08-12 11 views
3

Ich habe dieses Datum Problem seit langer Zeit konfrontiert. Habe viel versucht, aber vergebens. Das Problem läuft so ab:Mysql Datum Problem in verschiedenen Zeitzonen

Das vom Benutzer eingegebene Datum ist '2009-08-12'. Es wird ordnungsgemäß in der Datenbank gespeichert.

In der Zeitzone GMT + 530 wird das Datum ebenfalls korrekt angezeigt. Aber wenn ich die Zeitzone auf GMT + 1 ändere, wird das Datum als "2009-08-11" angezeigt, d. H. Es wird das Datum als 1 Tag zurück angezeigt.

Jede Hilfe oder Eingaben oder Vorschläge würde enorm helfen.

Dank

Nait

Antwort

5

Das Datum wahrscheinlich als DATETIME oder TIMESTAMP, 2009-08-12 00:00:00 +0530

umgewandelt wird in GMT+1 gespeichert ist, gibt es Sie 2009-08-11 19:30:00 +0100

MySQL ‚s DATETIME nicht gespeichert wird Zeitzone zusammen mit dem Zeitstempel, also wenn Ihr Typ DATETIME ist, ist es wahrscheinlich y Ihre Datenbankzugriffsebene, die die Daten konvertiert.

MySQL 's TIMESTAMP Typ speichert die Zeiten in UTC und sie werden zurück in die Zeitzone des Clients konvertiert, wenn sie abgefragt werden.

1

@Quassnoi hat erklärt, warum dies geschieht, aber die Art und Weise, es zu lösen ist, die verschiedenen Methoden auf java.sql.PreparedStatement und java.sql.ResultSet die einen Kalender Parameter nehmen zu verwenden - Methoden wie java.sql.PreparedStatement.setDate(int, Date, Calendar), java.sql.ResultSet.getDate(int, Calendar) usw.

Mein Rat Wählen Sie eine Standardzeitzone aus, die zur Darstellung von Daten in der Datenbank verwendet wird (normalerweise UTC), und führen Sie dann eine beliebige Konvertierung mit den oben genannten Methoden durch.

Natürlich, wenn Sie Ihren Client auf der gleichen Zeitzone als die Datenbank standardisieren können, die noch besser ist, und es ermöglicht Ihnen Datenvergleiche ohne Rücksicht auf Zeitzonen durchzuführen, so dass Sie einfach eine Konvertierung durchführen, wenn ein Datum angezeigt wird.

3

Dieses Problem ist sehr weit verbreitet. Zum Beispiel, hier sind einige Bemerkungen von Martin Fowler.

Das zugrunde liegende Problem ist, dass Java Datum Klassen behandeln Daten wie Mengen in der Physik - Darstellungen eines bestimmten, unveränderlichen Zeitpunkts.

Das Problem ist, dass dies nicht übereinstimmt, wie die meisten Menschen beiläufig über die Zeit denken. Im typischen Diskurs denken die Leute an "2009-08-01 18:00" als feste Idee. Das Problem ist, dass an eine solche Darstellung keine Zeitzone gebunden ist; daher repräsentiert es nicht wirklich einen bestimmten Augenblick.

Dies ist eine anhaltende Quelle der Verwirrung in vielen Anwendungen. Während Java immer Zeitzonen verwendet (entweder implizit oder explizit), speichern Datenbanken normalerweise keine Zeitzoneninformationen zusammen mit Datumsangaben. Daher muss Java beim Erstellen eines Date-Objekts eine angenommene Zeitzone HINZUFÜGEN. Dies wird von einem JDBC-Treiber ausgeführt, wenn der Wert in ein Date-Objekt konvertiert wird. Wenn ein solcher Code auf einem Server ausgeführt wird, stimmt die angenommene Zeitzone häufig nicht mit der vom Client/Endbenutzer verwendeten überein.

Die einzige Antwort besteht darin, sicherzustellen, dass Ihr Java-Code eine "Standard" -Zeitzone verwendet.

0

Ich habe ein ähnliches Problem bei der Arbeit mit Quarz mit Cron-Ausdrücke, die geplanten Aufträge wurden mit einem falschen Stundenwert gespeichert, ich nur die Server-Zeitzone, wo meine Anwendung auf meinem lokalen Zeitzone Wert gehostet und das Problem wurde behoben.

Verwandte Themen