1/3
go
utilizza il database del fuso orario
di IANA con nomi di zona precisi. Tentando di decodificare il modo in cui MySQL determina il formato del fuso orario locale da un host (Linux) e duplica quella logica in un go
client - come ha sottolineato @MattJohnson - si rivela inaffidabile.
2/3
database/sql.DB
- creato tramite Open(drv, DSN)
- utilizzerà lo stesso DSN
per tutti i collegamenti. Mentre un sql.DB
è pensato per essere creato una volta e utilizzato molte volte - non c'è modo di cambiare il DSN
dopo il fatto, quindi sarebbe necessario creare un nuovo sql.DB
quando si modifica il DSN
.
3/3
Quindi la strategia migliore sembra sfruttare MySQL
per convertire tutti i datetime
valori dal fuso orario locale al fuso orario UTC prima della trasmissione al client. Ciò elimina la complicazione dell'impostazione del fuso orario (possibilmente sconosciuto) del database al momento della connessione tramite il DSN
.
Un'opzione promettente è impostare il fuso orario della sessione della connessione:
SET @@session.time_zone = "+00:00";
- tuttavia, questo funziona solo per la corrente connessione (all'interno del pool di connessioni). Un
go
il client tuttavia non saprà quale connessione gratuita potrebbe utilizzare in qualsiasi momento. - Quindi, per garantire che funzioni sempre, è necessario applicarlo manualmente prima di tutte le query . Anche se è in uso una sola connessione DB, se la connessione non riesce e si avvia un nuovo tentativo di connessione, qualsiasi stato della sessione precedente andrebbe perso.
Quindi, invece, avvolgere tutto datatime
colonne con una funzione di conversione come questa:
CONVERT_TZ(`STAMP_UPDATED`,@@session.time_zone,'+00:00')
assicura che il calcolo del fuso orario venga eseguito al momento della query e non vada perso durante una riconnessione della connessione ecc.
Quindi ora il DSN
non è più necessario specificare loc
- come UTC
è l'impostazione predefinita. Infatti il DSN
necessita solo dell'opzione suffisso di ?parseTime=true
per consentire il datetime
da tradurre in go
time.Time
nativa di .
Infine e soprattutto, funzionerà con qualsiasi server impostato su qualsiasi fuso orario.
H/T a questa answer .