1/3
go verwendet die Time Zone Database
von IANA mit genauen Zonennamen. Der Versuch, zurückzuentwickeln, wie MySQL das lokale Zeitzonenformat von einem (Linux-)Host bestimmt, und diese Logik in einem go zu duplizieren Clients – wie @MattJohnson betonte – erweist sich als unzuverlässig.
2/3
database/sql.DB - erstellt über Open(drv, DSN) - verwendet denselben DSN für alle Anschlüsse. Während eine sql.DB soll einmal erstellt und viele Male verwendet werden - es gibt keine Möglichkeit, den DSN zu ändern im Nachhinein - also müsste man eine brandneue sql.DB erstellen beim Ändern des DSN .
3/3
Der bessere Weg scheint also, MySQL zu nutzen um alle datetime zu konvertieren Werte von der lokalen zur UTC-Zeitzone vor der Übertragung an den Client. Dadurch entfällt die komplizierte Einstellung der (möglicherweise unbekannten) Zeitzone der Datenbank zur Verbindungszeit über den DSN .
Eine vielversprechende Option besteht darin, die Sitzungszeitzone der Verbindung festzulegen:
SET @@session.time_zone = "+00:00";- das funktioniert aber nur für den aktuellen Verbindung (innerhalb des Verbindungspools). Ein
goDer Kunde weiß jedoch nicht, welche kostenlose Verbindung er gerade verwendet. - Um sicherzustellen, dass dies immer funktioniert, müsste man es vor allen Abfragen manuell anwenden . Selbst wenn nur eine DB-Verbindung verwendet wird – wenn die Verbindung fehlschlägt und die Verbindungswiederholung beginnt – würde jeder vorherige Sitzungsstatus verloren gehen.
Also stattdessen alle datatime umschließen Spalten mit einer Konvertierungsfunktion wie folgt:
CONVERT_TZ(`STAMP_UPDATED`,@@session.time_zone,'+00:00')
stellt sicher, dass die Zeitzonenberechnung zur Abfragezeit erfolgt und nicht während einer Verbindungswiederverbindung usw. verloren geht.
Also jetzt der DSN loc muss nicht mehr angegeben werden - als UTC ist die Vorgabe. Genauer gesagt der DSN benötigt nur die Suffix-Option ?parseTime=true um datetime zuzulassen in go zu übersetzen 's native time.Time .
Schließlich und vor allem funktioniert dies mit jedem Server, der auf eine beliebige Zeitzone eingestellt ist.
H/T auf diese Antwort .