一 问题描述
数据库:PGSQL
数据库时间为UTC,线上有一台Linux服务器是UTC+8,但是执行select now()时返回了UTC+8的时间
二 问题复现
使用navicat 查询
使用JDBC 查询
三 思路分析
两条一样的sql得出了不同的结果,所以我的猜测是 jdbc连接时额外维护了时区的信息
在连接处打上断点观察pgConnection,果然是为我们设置了默认值
四 寻找答案
从queryExecutor对象一直往上找,找到TimeZone对象最终赋值的地方
pgsql把TimeZone参数是从pgStream流对象中获取的,大部分的连接配置也封装在这个对象中。
想要继续寻找value的来源,可以debug一下ConnectionFactoryImpl类的tryConnect方法 创建连接时pg初始化了一些参数如下
最终通过 TimeZone.getDefault().getID() 获取了jvm的时区,由于jvm并未设置,也就获取了系统的时区