gorm中created_at 时间,go time时间,mysql数据库时间的一些问题总结

问题1 gorm中created_at 时间

在生成的时候发现数据库的时间慢了8个小时,后来发现是需要在连接数据库的时候加上参数&loc=local

func init(){driverName := viper.GetString("datasource.driverName")host := viper.GetString("datasource.host")port := viper.GetString("datasource.port")database := viper.GetString("datasource.database")username := viper.GetString("datasource.username")password := viper.GetString("datasource.password")charset := viper.GetString("datasource.charset")args := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local", //loc=local不能忘记username,password,host,port,database,charset)db, err := gorm.Open(driverName, args)if err != nil {panic("failed to connect database err: " + err.Error())}db.AutoMigrate(&defs.Users{})db.AutoMigrate(&defs.Video_Info{})db.AutoMigrate(&defs.Comments{})db.AutoMigrate(&defs.Sessions{})dbConn=db
}

问题2 go内置的time一些问题

使用time.Parse()解析字符串生成的时间的时区是UTC,而你调用time.Now() 则是CST,这导致你数据库中查时间段的数据会出错,如下代码

func TestListComments(t *testing.T)  {vid:="123"layout:="Jan 02 2006, 15:04:05"from,_:=time.Parse(layout,"Dec 14 2021, 20:18:15")//不加载时区fromUnix:=from.Unix()fmt.Println(from)fmt.Println(fromUnix)to:=time.Now()toUnix:=to.Unix()fmt.Println(to)fmt.Println(toUnix)comments, err := ListComments(vid, fromUnix, toUnix)if err!=nil{t.Errorf("Error of list comments:%v",err)}for _,val:=range comments{fmt.Printf("%#v",val)}
}

输出有误

2021-12-14 20:18:15 +0000 UTC
1639513095  //开始时间反而大于 结束时间,因为时区不对
2021-12-14 21:22:25.3100649 +0800 CST m=+0.032457601
1639488145

解析字符串并加载时区之后,时区一致

func TestListComments(t *testing.T)  {vid:="123"layout:="Jan 02 2006, 15:04:05"// 加载时区loc, err := time.LoadLocation("Asia/Shanghai") //一定要这个否则会弄错的from,_:=time.ParseInLocation(layout,"Dec 14 2021, 20:18:15",loc)fromUnix:=from.Unix()fmt.Println(from)fmt.Println(fromUnix)to:=time.Now()toUnix:=to.Unix()fmt.Println(to)fmt.Println(toUnix)comments, err := ListComments(vid, fromUnix, toUnix)if err!=nil{t.Errorf("Error of list comments:%v",err)}for _,val:=range comments{fmt.Printf("%#v",val)}
}

输出

2021-12-14 20:18:15 +0800 CST
1639484295
2021-12-14 21:20:16.129897 +0800 CST m=+0.088633101
1639488016
.....一些comment数据

问题3 mysql中的时间问题

我用gorm查询某个时间段的评论代码如下,可以看到我是以from和to 两个int64 类型,来作为查询条件,这是为了对应go中的unix时间戳也是int64

func ListComments(vid string ,from,to int64) ([]*defs.CommentWithName,error) {lock.RLock()defer lock.RUnlock()var res []*defs.CommentWithNamedbConn.Debug().Raw("select comments.id,users.username,comments.content FROM comments "+"INNER JOIN users on comments.author_id=users.id where comments.video_id=? AND comments.created_at > FROM_UNIXTIME(?) AND "+"comments.created_at <= FROM_UNIXTIME(?)", vid, from, to).Scan(&res)return res,nil
}

但是他在Mysql内部执行的时候出了一些问题,什么问题呢,也是时区问题。
关键在于FROM_UNIXTIME(?)这个函数,他这个函数是将unix时间戳转为正常时间,这个正常时间是和时区有关的,你相同的unix时间戳转为不同时区的正常时间,它是不一样的

所导致的问题

这会导致一个什么问题,就是你在插入评论的时候,插入的created_at这个字段的值是你的时区时间,但是你在查找的时候,mysql调用FROM_UNIXTIME(?)这个函数转化的时间又是另外时区的时间,那么你查询的时候就会出问题。

基础命令熟悉

在实验之前,先准备一下基础的命令

FROM_UNIXTIME(unix_timestamp,format)
返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。
SELECT FROM_UNIXTIME(1234567890, '%Y-%m-%d %H:%i:%S')

正常时间格式转换成unix时间戳
select unix_timestamp(current_date);

show variables like "%time_zone%";
查看时区
±-----------------±-------+
| Variable_name | Value |
±-----------------±-------+
| system_time_zone | CST |
| time_zone | SYSTEM |
±-----------------±-------+
2 rows in set (0.00 sec)
#time_zone说明mysql使用system的时区,system_time_zone说明system使用CST时区
修改时区
set global time_zone = '+8:00';##修改mysql全局时区为北京时间,即我们所在的东8区
set time_zone = '+8:00'; ##临时修改,只用于当前会话
flush privileges; #立即生效

然后当你设置不同的时区的时候,把unix时间戳转为正常时间就会不一样

情况1 当时区为+8.00
system_time_zone
time_zone +08:00
执行
select from_unixtime(1639484295,'%Y-%m-%d %H:%i:%S')
得到 2021-12-14 20:18:15

情况2 当时区为+0.00
system_time_zone
time_zone +00:00
执行
select from_unixtime(1639484295,'%Y-%m-%d %H:%i:%S')
得到 2021-12-14 12:18:15 差了8个小时

因此即然时间不对,那么你去查找某一时间段的内容,当然也会找不出。

所以在使用这三个内容的时候需要注意时间问题

gorm中created_at 时间,go time时间,mysql数据库时间的一些问题总结相关推荐

  1. 修改mysql数据库服务器时间格式,修改本地mysql数据库时间格式

    修改本地mysql数据库时间格式 内容精选 换一换 云数据库 GaussDB(for MySQL)仅按使用情况付费,没有最低收费.GaussDB(for MySQL)对您选择的数据库实例.数据库存储和 ...

  2. mysql 数据库时间类型 datetime 数据在页面上显示一串数字, 用函数date_format( )转换格式 ;

    mysql 数据库时间类型 datetime 转换格式 数据库时间字段datetime可以使用date_format( )函数进行时间的转换. 数据库时间字段类型: 数据库查询结果: 没转换前页面显示 ...

  3. 统一javaweb项目和mysql数据库时间UTC时间方法及原理

    统一javaweb项目和mysql数据库时间UTC时间方法及原理 文章目录 统一javaweb项目和mysql数据库时间UTC时间方法及原理 前言 UTC时间与 GMT时间 时间戳和时区 mysql时 ...

  4. Java 程序读取Mysql数据库时间信息与真实时间相差 13、14 小时、SQLException: HOUR_OF_DAY: 2 -> 3

    CST时区引起的异常: Java 程序读取Mysql数据库时间信息,与真实时间相差 13.14 小时 java.sql.SQLException: HOUR_OF_DAY: 2 -> 3 原因: ...

  5. mysql的时间在cmd的输入格式_获取“System.FormatException:输入字符串的格式不正确。”在日期时间对象插入到MySql数据库...

    我正在使用C#与Mvvm Light和Mysql数据库的应用程序.当我做一个插入到数据库与对象是一个DateTime对象,我收到以下错误的参数:获取"System.FormatExcepti ...

  6. MySQL数据库时间和jdbc查询时间相差12小时问题解决

    问题: 数据库所在操作系统时间正常(date命令),使用"select now() from dual;"在数据库管理工具查询,显示时间亦正常(与当前时间一致),但是通过jdbc查 ...

  7. mysql数据库时间突然是12小时制_为什么存入mysql数据库中的timestamp,晚了13或14个小时...

    # 为什么存入mysql数据库中的timestamp,晚了13个小时 ## 查看数据库时区 ``` show variables like '%time_zone%'; select @@global ...

  8. MYSQL数据库时间字段INT,TIMESTAMP,DATETIME性能效率比较

    from: http://www.piaoyi.org/database/MYSQL-INT-TIMESTAMP-DATETIME.html Author:飘易 Source:飘易 Categorie ...

  9. java获取mysql时间格式化_Java与mysql的时间格式化问题,获取时间的上下午

    Java与mysql的时间格式化问题,获取时间的上下午java 在项目中常常会遇到对时间进行格式化的问题,一次在对应用中发现,使用Java的SimpleDateFormat格式化时间,获取到的是上午, ...

最新文章

  1. python 图标字体_Icon-font图标字体的四类制作方法
  2. php fpm 日志记录,如何解决nginx下php-fpm不记录php报错日志的问题
  3. 神策数据全面支持苹果 ASA,全域归因方案再升级
  4. boost::range_pointer相关的测试程序
  5. zpl代码可以编译的特殊字符_国际C语言混乱代码大赛(IOCCC)代码解析
  6. 信号量sem_init,sem_wait,sem_post
  7. 802. 找到最终的安全状态
  8. ckeditor复制html样式丢失,Ckeditor选择html无法正常使用铬浏览器
  9. springboot使用netty容器_Spring Boot 2 实战:使用 Undertow 来替代Tomcat
  10. csharp:Compare two DataTables to rows in one but not the other
  11. 对MVC设计模式的理解
  12. 拼音模糊搜索 php,精确搜索加拼音搜索加模糊搜索
  13. 学习Java有哪些值得推荐的Java书籍?
  14. 模式分解无损连接判断——数据库考试复习
  15. lighttpd 配置 ssl证书
  16. bzoj2429: [HAOI2006]聪明的猴子(最小生成树)
  17. 什么叫做形态学图像处理_形态学图像处理
  18. 传统网络变压器和电容试片式性能区别
  19. Unity与安卓交互 | Unity2019.3版本之后,在Android Studio中写代码导出aar包与Unity中使用交互的方法
  20. python井字棋ai,python 井字棋(Tic Tac Toe)

热门文章

  1. 怎样只搜索淘宝的东西,不显示天猫的东西?
  2. android 版本更新下载,Android下载新版本并更新(DownLoadManager、HttpURLConnection)
  3. C语言实现五子棋对弈(简单输入坐标下棋,可设置悔棋次数版)
  4. 计算机网络中的广播啥意思,开启无线广播啥意思
  5. 2022如何对接三方支付通道
  6. k-means算法进行数据分析应用
  7. 计算几何——点到线的投影点的实现
  8. 计算机术语表达祝福,祝福新人的唯美句子
  9. 如何快速的将 DataTable 导入到 Excel 中 ?
  10. 计算机课图画的变形教案,电子工业版(内蒙古)信息技术四上第10课《图画变形记》教案1.doc...