Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie speichere ich ein java.util.Date in einem MySQL-Zeitstempelfeld in der UTC/GMT-Zeitzone?

Die kurze Antwort lautet:

  • fügen Sie "default-time-zone=utc" zu my.cnf hinzu
  • denken Sie in Ihrem Code immer in UTC, außer wenn Sie Datumsangaben für Ihre Benutzer anzeigen
  • Verwenden Sie beim Abrufen/Einstellen von Daten oder Zeitstempeln mit JDBC immer den Calendar-Parameter, der auf UTC:

    gesetzt ist

    resultset.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

  • Synchronisieren Sie entweder Ihre Server mit NTP oder verlassen Sie sich nur darauf, dass der Datenbankserver Ihnen sagt, wie spät es ist.

Die lange Antwort lautet:

Beim Umgang mit Daten und Zeitzonen in einer beliebigen Datenbank und mit einem beliebigen Client-Code empfehle ich normalerweise die folgende Richtlinie:

  1. Konfigurieren Sie Ihre Datenbank für die Verwendung der UTC-Zeitzone , anstatt die lokale Zeitzone des Servers zu verwenden (es sei denn, es ist natürlich UTC).

    • Wie das geht, hängt von Ihrem Datenbankserver ab. Anweisungen für MySQL finden Sie hier:http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . Grundsätzlich müssen Sie dies in my.cnf schreiben:default-time-zone=utc

    • Auf diese Weise können Sie Ihre Datenbankserver überall hosten, Ihren Hosting-Standort einfach ändern und ganz allgemein Daten auf Ihren Servern ohne Mehrdeutigkeit manipulieren.

    • Wenn Sie wirklich lieber eine lokale Zeitzone verwenden möchten, empfehle ich zumindest, die Sommerzeit zu deaktivieren, da mehrdeutige Datumsangaben in Ihrer Datenbank ein echter Alptraum sein können.
      • Wenn Sie beispielsweise einen Telefoniedienst aufbauen und die Sommerzeit auf Ihrem Datenbankserver verwenden, dann fragen Sie nach Ärger:Es gibt keine Möglichkeit festzustellen, ob ein Kunde, der von "2008- 10-26 02:30:00" bis "2008-10-26 02:35:00" tatsächlich für 5 Minuten oder für 1 Stunde und 5 Minuten aufgerufen (angenommen, die Sommerzeit wurde am 26. Oktober um 3 Uhr morgens eingeführt)!
  2. Verwenden Sie in Ihrem Anwendungscode immer UTC-Daten, außer wenn Sie Ihren Benutzern Daten anzeigen.

    • Verwenden Sie in Java beim Lesen aus der Datenbank immer:

    Zeitstempel myDate =resultSet.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

    • Wenn Sie dies nicht tun, wird davon ausgegangen, dass der Zeitstempel in Ihrer lokalen Zeitzone statt in UTC liegt.
  3. Synchronisieren Sie Ihre Server oder verlassen Sie sich nur auf die Zeit des Datenbankservers

    • Wenn Sie Ihren Webserver auf einem Server (oder mehreren) und Ihren Datenbankserver auf einem anderen Server haben, dann empfehle ich Ihnen dringend, ihre Uhren mit NTP zu synchronisieren.

    • ODER verlassen Sie sich nur auf einen Server, der Ihnen sagt, wie spät es ist. Normalerweise ist der Datenbankserver der beste, um nach Zeit zu fragen. Mit anderen Worten, vermeiden Sie Code wie diesen:

    PreparedStatement =connection.prepareStatement("UPDATE my_table SET my_time =? WHERE [...]");
    java.util.Date now =new java.util.Date(); // Ortszeit! :-(
    preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
    int result =PreparedStatement.execute();

    • Verlassen Sie sich stattdessen auf die Zeit des Datenbankservers:

    PreparedStatement =connection.prepareStatement("UPDATE my_table SET my_time =NOW() WHERE [...]");
    int result =PreparedStatement.execute();

Hoffe das hilft! :-)