如何在 GORM time.Time 数据类型上设置默认时区

How to set default Timezone on GORM time.Time data type

我正在使用带有 mysql 的 gorm 作为带有 go 模块的数据库,如下所示:

我的系统时区是 +07:00 (Asia/Jakarta),mysql 时区使用系统时区本身。

但是当我这样构造时出现了错误

type Name struct {
    ID         uint64    `gorm:"id;primaryKey;autoIncrement"`
    Name       string    `gorm:"column:name"`
    CreatedAt  time.Time `gorm:"column:created_at"`
    UpdatedAt  time.Time `gorm:"column:updated_at"`
}

在 mysql table created_at 和 updated_at 上声明为 DATETIME,当我打印 CreatedAt 和 UpdatedAt 值时,时区是 +0000 (UTC),当我尝试使用 Time.In 函数时,我得到了错误的值,就像我将时间从 UTC 转换为 +07:00,我该如何声明我使用 +07:00 作为默认时区的 GORM。

连接到 MySQL 数据库时,请确保根据 the docs:

使用 parseTimeloc 参数

to scan MySQL DATE and DATETIME values into time.Time variables, which is the logical equivalent in Go to DATE and DATETIME in MySQL. You can do that by changing the internal output type from []byte to time.Time with the DSN parameter parseTime=true. You can set the default time.Time location with the loc DSN parameter.

生成 DSN 连接字符串以设置 parseTime & loc see

loc, _ := time.LoadLocation("Asia/Jakarta") // handle any errors!

c := mysql.Config{
    User:                    "....",
    Passwd:                  "....",
    DBName:                  "....",
    Addr:                    "....:3306",
    Net:                     "tcp",
    ParseTime:               true,
    Loc:                     loc,
}
fmt.Println(c.FormatDSN())

https://go.dev/play/p/5yoEbmrPqlZ