Golang通过Gorm操作Mysql时遇到的datetime时区问题

情景描述

golang使用Gorm操作MySQL,MySQL中数据类型是datetime,Golang中用的是time.now。
但是会导致存储的时间与北京时间有8h误差, 显然是没有初始化时区导致。

问题修复

初始化设置时区

参考我自己之前写过的一篇总结——Mysql中多种日期类型——DATETIME、TIMESTAMP、TIME、YEAR、DATE的区分

datetime是给什么就存什么,timestamp则是转换为UTC+8才存。
所以我认为应该是在Golang中写一个时区初始化即可。
于是我在main函数开头加上了

	time.LoadLocation("Asia/Shanghai") 

bug依然没有解决。

我在我的存储部分,进行输出测试。

func (l *Like) LikeOne(ctx context.Context, uid, bid int) (repo.LikeInformation, error) {
	likeRes := repo.LikeInformation{
		CreatedAt: time.Now(),
		BlogID:    bid,
		UserID:    uid,
	}
	fmt.Println(time.Now())
	fmt.Println(likeRes.CreatedAt)
	err := l.db.Table(define.TableLike).Create(&likeRes).Error
	if err != nil {
		return repo.LikeInformation{}, err
	}
	return likeRes, nil
}

在这里插入图片描述

发现添加时区是生效的。

问题解决

通过参阅:

https://www.jianshu.com/p/030b880ecc5e

发现问题可能是出现在我的db连接时。
我仅仅是初始化了本地的时区,但是云服务器的数据库建立连接时,并没有设置时区。因此导致问题。

const dsn = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&loc=Local"

func NewDbClient() (*gorm.DB, error) {
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		return nil, err
	}

	return db, nil
}

解决方法也很简单:在建立gorm连接时候,也初始化一下时区即可。