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

这篇具有很好参考价值的文章主要介绍了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
}

Golang通过Gorm操作Mysql时遇到的datetime时区问题,莫名其妙的报错——我太傻了,Golang,golang,mysql,开发语言

发现添加时区是生效的。

问题解决

通过参阅:

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连接时候,也初始化一下时区即可。文章来源地址https://www.toymoban.com/news/detail-806964.html

到了这里,关于Golang通过Gorm操作Mysql时遇到的datetime时区问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Golang实战] gorm中使用Raw()和 Exec() 两种方式操作sql原生语句的特点和区别

    当我在gorm中使用原生sql操作数据库时,时常用raw() 和 exec() ,有时候经常遇到数据插不进去或者 数据帮i当不到结构体,原来是 这两个方法有不同的用处和特点 个人理解: 需要查询数据 映射到结构体时使用 官方理解: DB.Raw() 方法用于执行原始 SQL 查询语句或可执行的命令。

    2024年02月13日
    浏览(42)
  • go gorm 操作MySQL初探

    安装 实例 参考 https://duoke360.com/tutorial/gorm/query-recored

    2024年02月12日
    浏览(30)
  • MySQL版本不同带来Incorrect DATETIME value: ‘‘问题

    业务场景:线上数据同步到本地(开发测试) 版本:线上-5.7    本地-8.0 尝试操作方式: 1、SQL文件 2、备份还原 3、navicat自带传输工具 最终结果:只能备份其中的部分数据,视图同步下来出现  Incorrect DATETIME value: \\\'\\\' 问题 尝试解决方案: 按上述操作之后又会出现新的错误

    2024年02月13日
    浏览(37)
  • Mysql时区问题及解决方法

    MySQL是一种常用的开源关系型数据库,它在处理时间和日期时会受到时区的影响。因此,在使用MySQL时,时区设置容易引发一些错误。本文将介绍MySQL时区问题可能引发的错误,并提供一些解决方案。 错误1:时间不正确 在使用MySQL时,如果你的系统时区与MySQL服务器时区不一致

    2024年02月14日
    浏览(25)
  • 彻底搞懂MySQL TimeStamp的时区问题

    mysql中有两个时间类型,timestamp与datetime,其中timestamp在存储上是包含时区的,而datetime是不包含时区的字符串形式。而通常应用下所说的时区问题,也指的是Java应用使用了jdbc驱动时,存储和读取的时区不一致的问题,两者可能会相差8小时或者13小时,今天,就来彻底搞懂为

    2024年02月03日
    浏览(36)
  • Mysql 时区差8小时的多种问题 统统解决

    最近在开发【Java面试 | 笑小枫】小程序,便发现老是有人半夜偷偷刷题,如下图所示: 现在都这么卷了吗?大半夜的都不睡觉了吗?还在撸题~越想越不对,赶紧看了一下,发现自己录入题目的时间也好多都在凌晨。 好家伙,秒懂,时区错了。错就错了吧,影响也不大。 直

    2024年02月05日
    浏览(26)
  • docker启动容器指定时区 解决mysql时间非北京时间问题

    运行docker镜像的时候可以指定环境变量TZ来设置使用那个时区的时间。如果不指定有些镜像在制作的时候设置了跟自己想用的时区不一样的时区就会出现尴尬的问题。 指定使用东八区时区命令如下: docker run -e TZ=Asia/Shanghai … docker启动mysql容器命令,指定库表编码:

    2024年02月14日
    浏览(35)
  • Golang Gorm 一对多查询 preload预加载

     GORM允许使用  Preload 通过多个SQL中来直接加载关系, 例如: 其实很简单, 你要preload  user表 的数据,gorm就提前把这张表全部取出来,然后再执行 First 或 Find 这样的方法去查询主数据,最后把两种数据通过外键关联一一对应起来。 其实preload也就是做了两次查询。    有了

    2024年02月11日
    浏览(32)
  • Golang Gorm 更新字段 save、update、updates

    更新和删除操作的前提条件都是要在找到数据的情况下,先要查询到数据才可以做操作。 更新的前提的先查询到记录, Save保存所有字段,用于单个记录的全字段更新 ,它会保控所有字段,即使零值也会保存。 在更新和删除之前,要利用之前学的查询语句先查询到数据,再

    2024年02月03日
    浏览(25)
  • 开源 Golang 微服务入门三:ORM 框架 GORM

    前两篇笔记分别介绍了 Golang 微服务 HTTP 框架 Hertz 和 Golang 微服务 RPC 框架 Kitex,本文将要介绍面向ORM(持久层)框架 GORM。 官方文档 GORM 是面向 Golang 语言的一种 ORM(持久层)框架,支持多种数据库的接入,例如 MySQL,PostgreSQL,SQLite,SQL Server,Clickhouse。此框架的特点,弱化了开

    2024年02月14日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包