Gorm中time.time的默认时区

作者 : admin 本文共658个字,预计阅读时间需要2分钟 发布时间: 2024-06-5 共1人阅读
问题复现

期望查询结果时区使用本机的默认时区(东八区):

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)
}

参数:

  1. parseTime
    1. 解析时间,设置为true,将数据库中的时间值解析为 time.Time 类型。
  2. loc
    1. 设置时区,例如,loc=UTC 或者 loc=Local

源代码

1、结构体:Config是一个从DSN字符串解析的配置。

go/pkg/mod/github.com/go-sql-driver/mysql@v1.7.0/dsn.go:36

Gorm中time.time的默认时区插图

2、如果没有解析到相关字段,那么使用默认值:

Gorm中time.time的默认时区插图(1)

3、实例化对象

Gorm中time.time的默认时区插图(2)

4、当config.DSN 不为空,那么开始解析字符串为结构体

Gorm中time.time的默认时区插图(3)

5、覆盖默认值 

Gorm中time.time的默认时区插图(4)

总结

通过DSN可以修改时区,如果不传loc该参数,那么默认值是UTC。

最终期望值和实际输出值一致,完美!!!

Gorm中time.time的默认时区插图(5)


我为人人,人人为我,美美与共,天下大同。

本站无任何商业行为
个人在线分享 » Gorm中time.time的默认时区
E-->