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