最近在工作中遇到个问题,java程序启动后,获取数据库中的datetime类型数据,输出的时间的时区是UTC时区的,而我们所在的时区是东八区(Asia/Shanghai)。
排查过程:
1.查看数据库中的数据记的时间是哪个时区的
– 数据库记的也是UTC时区的时间。
另外也查看了数据库的相关时区变量:
show variables like "%time_zone%";
结果都是东八区;
记录到数据库中是UTC时间是不是问题呢?
–经过一番百度谷歌…
找到了这篇科普
他的结论是:
所以比较好的做法是,数据库中使用DATETIME,然后存时间的时候一律用程序生成UTC时间(而不是local时区的时间)存进去,取出来的时候不管想显示服务器时间还是显示用户的时间都可以处理。
顺便提一句,根据用户所在地时区显示时间有两种做法:
当用户第一次访问网站的时候,用js获取时区发送到服务器上存到session里
用js处理时间的显示(我觉得这种比较方便一点,毕竟不用改服务端代码)
由于我们都是在东八区,为了避免测试人员或者用户对数据库的时间有疑惑,我就直接在JDBC连接指定 serverTimezone=Asia/Shanghai ;
此时,数据库中记录的时间已经是东八区时间了,当时调用接口查询出来的时间却是UTC时间。
整理一