情景描述
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连接时候,也初始化一下时区即可。