1/3
go
använder IANA:s tidszondatabas
med exakta zonnamn. Försöker omvända konstruera hur MySQL bestämmer det lokala tidszonsformatet från en (Linux) värd och duplicera den logiken i en go
klienter - som @MattJohnson påpekade - visar sig vara opålitliga.
2/3
database/sql.DB
- skapad via Open(drv, DSN)
- kommer att använda samma DSN
för alla anslutningar. Medan en sql.DB
är tänkt att skapas en gång och användas många gånger - det finns inget sätt att ändra DSN
i efterhand - så man skulle behöva skapa en helt ny sql.DB
när du ändrar DSN
.
3/3
Så ju bättre tack, verkar dra nytta av MySQL
för att konvertera alla datetime
värden från lokal till UTC-tidszon innan överföring till klienten. Detta tar bort komplikationen med att ställa in databasens (möjligen okänd) tidszon vid anslutningstid via DSN
.
Ett lovande alternativ är att ställa in anslutningens sessionstidszon:
SET @@session.time_zone = "+00:00";
- dock fungerar detta bara för aktuella anslutning (inom anslutningspoolen). En
go
klienten kommer dock inte att veta vilken gratis anslutning de kan använda när som helst. - Så för att säkerställa att detta alltid fungerar måste man tillämpa det manuellt före alla frågor . Även om bara en DB-anslutning används - om anslutningen misslyckas och anslutningsförsöket startar igen - skulle alla tidigare sessionstillstånd gå förlorade.
Så istället, packa all datatime
kolumner med en konverteringsfunktion så här:
CONVERT_TZ(`STAMP_UPDATED`,@@session.time_zone,'+00:00')
säkerställer att tidszonsberäkningen görs vid förfrågningstillfället och inte kommer att gå förlorad under en återkoppling av anslutningen etc.
Så nu DSN
behöver inte längre ange loc
- som UTC
är standard. Faktum är att DSN
behöver bara suffixalternativet ?parseTime=true
för att tillåta datetime
ska översättas till go
s ursprungliga time.Time
.
Slutligen och viktigast av allt, detta kommer att fungera med vilken server som helst som är inställd på vilken tidszon som helst.
H/T till detta svar .