2016-04-18 13 views
1

Natürlich ist der Titel das erwartete Ergebnis, aber ich bin mir nicht sicher, wie es zu beheben ist. Ich habe meine Produktionsserver MySql in MST ausgeführt. Ich teste meine Anwendung lokal in EST.MySql Anwendungen in verschiedenen Zeitzonen geben unterschiedliche Ergebnisse

Wir verwenden Joda Zeit. Hier ist, wo das Problem kommt:

DateTime nowTime = new DateTime(); 
DateTime endTime = myObject.getEndTime(); 
Duration duration = new Duration(nowTime, endTime); 

if(duration.getStandardMinutes() < 15) { 
    //do something time critical 
} 

Natürlich, das funktioniert gut, wenn die Anwendung in MST ausgeführt wird, aber für meine lokale Anwendung EST läuft, ist es weg von der Zeitzone Unterschied.

Weiß jemand, wie man das löst? Angenommen, das Ändern der Standardzeitzone auf Ihrem MySql-Server ist keine Option, da wir Legacy-Anwendungen haben, die es teilen. Idealerweise könnten wir einfach die Zeitzone auf GMT einstellen, damit wir UTC-Zeit haben könnten.

Bearbeiten: Weiß jemand, ob es eine Möglichkeit gibt, den Wechsel von UTC in die aktuelle Zeitzone beim Abruf zu vermeiden (siehe fett unten in der Dokumentation)?

Die aktuelle Einstellung der Sitzungszeitzone wirkt sich auf Anzeige und Speicherung von Zeitwerten aus, die zonenabhängig sind. Dazu gehören die Werte , die von Funktionen wie NOW() oder CURTIME() angezeigt werden, und Werte, die in TIMESTAMP-Spalten gespeichert sind und aus diesen abgerufen werden ( ). Die Werte für die TIMESTAMP-Spalten werden für die Speicherung von der aktuellen Zeitzone in UTC und für den Abruf von UTC in die aktuelle Zeitzone konvertiert.

Oder ist die einzige Option, um diese wieder zu UTC programmatisch nach Retrieval-Format konvertieren?

+0

Sie die Zeitzone pro Verbindung in MySQL einstellen. – Barmar

+0

Oder Sie können 'convert_tz()' in MySQL verwenden. https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_convert-tz – Barmar

+0

@Barmar Können Sie? Ich kann keine Dokumentation darüber finden, wie man das macht. Wenn ich kann, glaube ich, dass das hier die Lösung wäre. – Matt

Antwort

0

Sie können den folgenden Code verwenden, um die UTC/GMT Datetime

System.out.println("UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime(org.joda.time.DateTimeZone.UTC)); 
2

Stellen Sie die Zeitzone für die Verbindung mit der Abfrage zu erhalten:

SET SESSION time_zone = 'UTC' 

können Sie SESSION weglassen - Einstellsystem Variablen verwendet standardmäßig die Sitzungsvariable. Siehe SET Syntax Dokumentation.

Wenn Sie Zeitzoneninformationen nicht in die Datenbank konfiguriert haben, siehe convert_tz returns null

Sie können auch eine numerische Zeitzone verwenden:

SET time_zone = '+00:00' 
+0

Ein wenig neu für mich. Ich benutze MySql Ver 14.14 Distrib 5.5.29, für Linux (x86_64) mit Readline 5.1. Verwenden: USE mysql; SELECT * FROM 'time_zone_name'; gibt keine Zeilen zurück. Und natürlich, wenn die Sitzung auf 'EST' gesetzt wird, wird die Zeitzone nicht gefunden. – Matt

+0

Siehe http: // stackoverflow.com/questions/14454304/convert-tz-returns-null/14454465 # 14454465 zum Aktualisieren der Zeitzone Tabelle – Barmar

+0

Danke Barmar, das ist eine gute Lektion. Ich denke jedoch, dass ich es gerne in der Verbindungszeichenfolge festlegen würde. Gibt es keine Möglichkeit, das zu tun? Die Einstellung für die Sitzung ist in manchen Fällen hilfreich, würde aber eher die App verwenden, die UTC über ihre db-Verbindung verwendet. – Matt

Verwandte Themen