最近发现一个测试数据库中的几个时间日期的字段有问题。这个数据库相当是一个从库,是一个队列消费者服务接收另一个数据库的更新信息同步的。这个库的时间比原库快了14个小时。
这就很奇怪了,东八区和UTC差八个小时,这14个小时怎么解释呢?而且我本地测试另外一个服务,在代码中试着查询 curtime() 也比当前时间快了14个小时。可是在Datagrip里面查时间确是正确的。
这肯定是时区设置的问题,我隐约记得CST(中国标准时间)也有美国中部时间的意思(Central Standard Time),而且我们是在东八区,美国中部时间是西六区。 8+6=14
我在网上找到了类似疑问forums.mysql.com/read.php?39…
而且我在代码里面搜索serverTimeZone 在mysql-connector-java发现了
原来如果在jdbc-url中不显式地设置serverTimeZone的话会读取mysql服务器的时区信息来设定此值,服务器如果是linux的话东八区会返回CST, 然而Java是把CST理解为美国中部时间的。读取的时间会被加上14个小时来显式客户端的时间 (通过打断点验证)。我本地和测试环境的队列消费服务的 jdbc-url都没有设置 serverTimezone. 解决方法就是乖乖地加上 serverTimezone=Asia/Shanghai
我很好奇网上怎么没有大量的关于这个问题的讨论。大家都很自觉地显式设置时区了吗,还是mysql服务器都不是linux的?