1/3
go
utilise la base de données de fuseaux horaires
de l'IANA avec des noms de zone précis.Essayer d'inverser la manière dont MySQL détermine le format de fuseau horaire local à partir d'un hôte (Linux) et de dupliquer cette logique dans un go
les clients - comme l'a souligné @MattJohnson - s'avèrent peu fiables.
2/3
database/sql.DB
- créé via Open(drv, DSN)
- utilisera le même DSN
pour toutes les connexions. Alors qu'un sql.DB
est destiné à être créé une fois et utilisé plusieurs fois - il n'y a aucun moyen de changer le DSN
après coup - il faudrait donc créer un tout nouveau sql.DB
lors du changement de DSN
.
3/3
Donc, la meilleure tactique semble tirer parti de MySQL
pour convertir tous les datetime
valeurs du fuseau horaire local au fuseau horaire UTC avant transmission au client. Cela supprime la complication de la définition du fuseau horaire de la base de données (éventuellement inconnu) au moment de la connexion via le DSN
.
Une option prometteuse consiste à définir le fuseau horaire de la session de connexion :
SET @@session.time_zone = "+00:00";
- cependant, cela ne fonctionne que pour le courant connexion (au sein du pool de connexion). Un
go
le client ne saura cependant pas quelle connexion gratuite il peut utiliser à un moment donné. - Ainsi, pour s'assurer que cela fonctionne toujours, il faudrait l'appliquer manuellement avant toutes les requêtes . Même si une seule connexion à la base de données est utilisée - si la connexion échoue et qu'une nouvelle tentative de connexion est lancée - tout état de session précédent sera perdu.
Donc, à la place, envelopper tous les datatime
colonnes avec une fonction de conversion comme celle-ci :
CONVERT_TZ(`STAMP_UPDATED`,@@session.time_zone,'+00:00')
garantit que le calcul du fuseau horaire est effectué au moment de la requête et ne sera pas perdu lors d'une reconnexion, etc.
Alors maintenant, le DSN
n'a plus besoin de spécifier loc
- comme UTC
est la valeur par défaut. En fait la DSN
n'a besoin que de l'option de suffixe ?parseTime=true
pour autoriser le datetime
à traduire en go
time.Time
natif de .
Enfin et surtout, cela fonctionnera avec n'importe quel serveur défini sur n'importe quel fuseau horaire.
H/T à cette réponse .