go-sql-driver/mysqlを使ってMySQLにSQLを投げて、その結果をあれこれするAPIを作成していたときにちょっとはまったことのメモ。
問題の発覚
MySQLのタイムゾーンの確認。
show variables like '%time_zone%'
=>
|Variable_name|Value|
|system_time_zone|UTC|
|time_zone|SYSTEM|
MySQLのタイムゾーンがUTCなのにgo-sql-driver/mysqlを使ったSQLの実行結果を見るとJSTで返ってきてしまっていた。
MySQL: 2020-01-01 00:00:00 UTC
SQL実行結果のパース: 2020-01-01 00:00:00 JST
そこでmain.goに下記を書いて、Goアプリケーションでのタイムゾーンを確認。
main.go
fmt.Println(time.Now())
=> 2020-01-15 13:46:07.4988314 +0000 UTC m=+1.180576601
で返ってきていた。
Goアプリケーション内でもMySQLでもUTCなのになんでSQLの実行結果だけJSTになるんだ???
解決
上記の記事を見ていて気づいたが、
mysql.go
db, err := sql.Open("mysql", "xxxx:zzzzzzz@/dbname?parseTime=true&loc=Asia%2FTokyo")
としてしまっていたため、MySQLがUTCなのにGoで受け取ったときはそれにJSTのラベルをわざわざ付けてしまっていた…
そこで下記のように修正。
mysql.go
db, err := sql.Open("mysql", "xxxx:zzzzzzz@/dbname?parseTime=true")
単純な理由だけど1時間位はまったのでメモ。