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
goklienten 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 .