问题复现
期望查询结果时区使用本机的默认时区(东八区):
2024-06-05 04:43:54 +0800 CST
实际查询结果(UTC):
2024-06-04 20:43:54 +0000 UTC
如何解决
问题是通过gorm查询mysql数据库时做了转化,转化的过程中默认使用的时区:UTC,需要在配置Data Source Name (DSN)时,设置相应的参数,进行重写覆盖,使用自己的时区。
dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
参数:
- parseTime
- 解析时间,设置为true,将数据库中的时间值解析为
time.Time
类型。
- 解析时间,设置为true,将数据库中的时间值解析为
- loc
- 设置时区,例如,
loc=UTC 或者 loc=Local
- 设置时区,例如,
源代码
1、结构体:Config是一个从DSN字符串解析的配置。
go/pkg/mod/github.com/go-sql-driver/mysql@v1.7.0/dsn.go:36
2、如果没有解析到相关字段,那么使用默认值:
3、实例化对象
4、当config.DSN 不为空,那么开始解析字符串为结构体
5、覆盖默认值
总结
通过DSN可以修改时区,如果不传loc该参数,那么默认值是UTC。
最终期望值和实际输出值一致,完美!!!
我为人人,人人为我,美美与共,天下大同。