1/3
go
menggunakan Database Zona Waktu
IANA dengan nama zona yang tepat. Mencoba merekayasa balik cara MySQL menentukan format zona waktu lokal dari host (Linux) dan menduplikasi logika itu dalam go
klien - seperti yang ditunjukkan @MattJohnson - terbukti tidak dapat diandalkan.
2/3
database/sql.DB
- dibuat melalui Open(drv, DSN)
- akan menggunakan DSN
yang sama untuk semua koneksi. Sementara sebuah sql.DB
dimaksudkan untuk dibuat sekali dan digunakan berkali-kali - tidak ada cara untuk mengubah DSN
setelah fakta - jadi orang perlu membuat sql.DB
yang benar-benar baru saat mengubah DSN
.
3/3
Jadi taktik yang lebih baik, tampaknya memanfaatkan MySQL
untuk mengonversi semua datetime
nilai dari zona waktu lokal ke UTC sebelum transmisi ke klien. Ini menghilangkan kerumitan pengaturan zona waktu database (mungkin tidak diketahui) pada waktu koneksi melalui DSN
.
Salah satu opsi yang menjanjikan, adalah menyetel zona waktu sesi koneksi:
SET @@session.time_zone = "+00:00";
- namun, ini hanya berfungsi untuk saat ini koneksi (dalam kumpulan koneksi).
go
klien tidak akan tahu koneksi gratis mana yang mungkin mereka gunakan pada waktu tertentu. - Jadi untuk memastikan ini selalu berfungsi, seseorang perlu menerapkannya secara manual sebelum semua kueri . Meskipun hanya satu koneksi DB yang digunakan - jika koneksi gagal dan koneksi mencoba lagi - semua status sesi sebelumnya akan hilang.
Jadi sebagai gantinya, bungkus semua datatime
kolom dengan fungsi konversi seperti ini:
CONVERT_TZ(`STAMP_UPDATED`,@@session.time_zone,'+00:00')
memastikan penghitungan zona waktu dilakukan pada waktu kueri dan tidak akan hilang selama koneksi ulang koneksi, dll.
Jadi sekarang DSN
tidak perlu lagi menentukan loc
- sebagai UTC
adalah default. Sebenarnya DSN
hanya membutuhkan opsi sufiks ?parseTime=true
untuk mengizinkan datetime
untuk diterjemahkan menjadi go
time.Time
asli .
Terakhir dan yang terpenting, ini akan berfungsi dengan server apa pun yang disetel ke zona waktu apa pun.
H/T ke jawaban ini .