最近在做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中处理的方法不见得有效,请自己验证。
当然也可以设置数据库连接串,使其取时间时按照指定时区取,这个设置取决于你使用的框架。