go连接postgresql 数据库查询时间丢失时区的问题(查出时间与实际时间相差8小时)

最近在做go连接postgres的项目,取数据时发现日期类型的数据与实际时间相差8小时,很明显时区的问题:

数据库时间:

前台显示 错误时间

不要以为显示的一样就觉得时间没错,注意看前台页面带T和Z,也就是说前台显示的是 “时间值对应的0时区的时间”,如果前台做一下显示格式化就会很明显的发现时间不对,使用 

new Date(value)

格式化一下,前台显示 错误时间 如下:

这回很明显看出来是相差8个小时。

调试找问题过程多说无益,直接说结果:

1,数据库连接字符串问题,这种问题以前在java连接mysql的时候遇见过。但是这次不是这问题,因为我把sql改成 select now() 语句通过数据库连接查出的时间是正确的。

这种问题也查了好多资料(基于下方第三、第四个连接发现并解决了问题):

http://gorm.book.jasperxu.com/database.html#dbc

https://blog.csdn.net/u013210620/article/details/82702114

https://www.freesion.com/article/3542602961/

https://blog.csdn.net/jui121314/article/details/85009792

https://ld246.com/article/1534142362794?p=1&m=0

https://www.yiibai.com/manual/postgresql/datatype-datetime.html

2,数据问题,比如存入的不带时区,或者是按照0时区存的,取出的时候按照东8区取,肯定会有问题。我的问题就是这个问题:

pgsql中 timestamp 有两种 timestamp [ (p) ] [ without time zone ] 和 timestamp [ (p) ] with time zone

我们的DBA使用的是不带timeZone 的timestamp ,也就是说存进去的数据带着+8时区(中国标准时间),数据库存储时没有存时区,取出来的时候go当成了0时区,而不是东8区(使用的 ‘’github.com/jinzhu/gorm" "github.com/lib/pq"),所以丢失了8个小时。

以下是pg数据类型说明

https://www.yiibai.com/manual/postgresql/datatype-datetime.html

 

我的解决方法:

修改查询sql,在时间字段后加上“ at time zone 'PRC' ”

select create_time at time zone 'PRC' create_time,...... from XXX.

前台显示 正确时间

 

其它解决方法参见:

https://blog.csdn.net/jui121314/article/details/85009792

但我发现go取出时就已经默认设置成0时区了(取决于数据库连接框架),所以上述博文中的第二个Java中处理的方法不见得有效,请自己验证。

当然也可以设置数据库连接串,使其取时间时按照指定时区取,这个设置取决于你使用的框架。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值