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
go
Der 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 .