问题:
javaweb项目查询返回的时间总是有问题,比实际时间要晚8小时。
比如数据库记录的时间为:2019-11-21 15:52:30 而查询出来的时间为:2019-11-21 23:52:30 足足相差了8个小时
检查是jdbc连接的url中配置的时区有问题,原先是:
jdbc:mysql://172.xx.xx.xx:3306/test?useUnicode=true&characterEncoding=gbk&useSSL=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
分析:
分析:数据库的时区用的东八区(或者存储数据的时候使用的东八的时间),而javaweb项目使用的是UTC(世界统一时间、世界标准时间、国际协调时间),应该是查询出来以后java或者mysql进行时间转换。
尝试了GMT、GMT8、UTC+8,UTC0800等可能的参数,但均报错。后来在mysql文档中发现可用的时区都在/usr/share/zoneinfo目录下,ll下发现可用的时区信息如下:
lewis@lewis-dzwww:/usr/share/zoneinfo$ ll 总用量 308 drwxr-xr-x 21 root root 4096 5月 27 12:54 ./ drwxr-xr-x 334 root root 12288 6月 21 15:11 ../ drwxr-xr-x 2 root root 4096 5月 27 12:56 Africa/ drwxr-xr-x 6 root root 4096 5月 27 12:56 America/ drwxr-xr-x 2 root root 4096 5月 27 12:56 Antarctica/ drwxr-xr-x 2 root root 4096 5月 27 12:56 Arctic/ drwxr-xr-x 2 root root 4096 5月 27 12:56 Asia/ drwxr-xr-x 2 root root 4096 5月 27 12:56 Atlantic/ drwxr-xr-x 2 root root 4096 5月 27 12:56 Australia/ drwxr-xr-x 2 root root 4096 5月 27 12:56 Brazil/ drwxr-xr-x 2 root root 4096 5月 27 12:56 Canada/ -rw-r--r-- 1 root root 2102 4月 21 02:09 CET drwxr-xr-x 2 root root 4096 5月 27 12:56 Chile/ -rw-r--r-- 1 root root 2294 4月 21 02:09 CST6CDT -rw-r--r-- 1 root root 2437 4月 21 02:09 Cuba -rw-r--r-- 1 root root 1876 4月 21 02:09 EET -rw-r--r-- 1 root root 1972 4月 21 02:09 Egypt -rw-r--r-- 1 root root 3559 4月 21 02:09 Eire -rw-r--r-- 1 root root 127 4月 21 02:09 EST -rw-r--r-- 1 root root 2294 4月 21 02:09 EST5EDT drwxr-xr-x 2 root root 4096 5月 27 12:56 Etc/ drwxr-xr-x 2 root root 4096 5月 27 12:56 Europe/ -rw-r--r-- 1 root root 264 4月 21 02:09 Factory -rw-r--r-- 1 root root 3687 4月 21 02:09 GB lrwxrwxrwx 1 root root 2 5月 27 09:07 GB-Eire -> GB -rw-r--r-- 1 root root 127 4月 21 02:09 GMT lrwxrwxrwx 1 root root 3 5月 27 09:07 GMT0 -> GMT lrwxrwxrwx 1 root root 3 5月 27 09:07 GMT-0 -> GMT lrwxrwxrwx 1 root root 3 5月 27 09:07 GMT+0 -> GMT lrwxrwxrwx 1 root root 3 5月 27 09:07 Greenwich -> GMT -rw-r--r-- 1 root root 1189 4月 21 02:09 Hongkong -rw-r--r-- 1 root root 128 4月 21 02:09 HST -rw-r--r-- 1 root root 1190 4月 21 02:09 Iceland drwxr-xr-x 2 root root 4096 5月 27 12:56 Indian/ -rw-r--r-- 1 root root 1678 4月 21 02:09 Iran -rw-r--r-- 1 root root 4475 2月 24 17:01 iso3166.tab -rw-r--r-- 1 root root 2265 4月 21 02:09 Israel -rw-r--r-- 1 root root 507 4月 21 02:09 Jamaica -rw-r--r-- 1 root root 355 4月 21 02:09 Japan -rw-r--r-- 1 root root 237 4月 21 02:09 Kwajalein -rw-r--r-- 1 root root 10384 2月 22 23:58 leap-seconds.list -rw-r--r-- 1 root root 655 4月 21 02:09 Libya lrwxrwxrwx 1 root root 14 5月 27 09:07 localtime -> /etc/localtime -rw-r--r-- 1 root root 2102 4月 21 02:09 MET drwxr-xr-x 2 root root 4096 5月 27 12:56 Mexico/ -rw-r--r-- 1 root root 127 4月 21 02:09 MST -rw-r--r-- 1 root root 2294 4月 21 02:09 MST7MDT -rw-r--r-- 1 root root 2453 4月 21 02:09 Navajo -rw-r--r-- 1 root root 2460 4月 21 02:09 NZ -rw-r--r-- 1 root root 2057 4月 21 02:09 NZ-CHAT drwxr-xr-x 2 root root 4096 5月 27 12:56 Pacific/ -rw-r--r-- 1 root root 2705 4月 21 02:09 Poland -rw-r--r-- 1 root root 3453 4月 21 02:09 Portugal drwxr-xr-x 19 root root 4096 5月 27 12:56 posix/ -rw-r--r-- 1 root root 3545 4月 21 02:09 posixrules -rw-r--r-- 1 root root 414 4月 21 02:09 PRC -rw-r--r-- 1 root root 2294 4月 21 02:09 PST8PDT drwxr-xr-x 19 root root 4096 5月 27 12:56 right/ -rw-r--r-- 1 root root 800 4月 21 02:09 ROC -rw-r--r-- 1 root root 571 4月 21 02:09 ROK -rw-r--r-- 1 root root 428 4月 21 02:09 Singapore drwxr-xr-x 2 root root 4096 5月 27 12:56 SystemV/ -rw-r--r-- 1 root root 2747 4月 21 02:09 Turkey -rw-r--r-- 1 root root 127 4月 21 02:09 UCT lrwxrwxrwx 1 root root 4 5月 27 09:07 Universal -> Zulu drwxr-xr-x 2 root root 4096 5月 27 12:56 US/ lrwxrwxrwx 1 root root 4 5月 27 09:07 UTC -> Zulu -rw-r--r-- 1 root root 1873 4月 21 02:09 WET -rw-r--r-- 1 root root 1528 4月 21 02:09 W-SU -rw-r--r-- 1 root root 17533 4月 13 16:01 zone1970.tab -rw-r--r-- 1 root root 19014 4月 13 16:01 zone.tab -rw-r--r-- 1 root root 127 4月 21 02:09 Zulu
解决方案:
为解决此问题,可以选择东8区的Hongkong、Asia/Shanghai或者Asia/Hongkong作为参数,修改后url为:
jdbc:mysql://172.xx.xx.xx:3306/test?useUnicode=true&characterEncoding=gbk&useSSL=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Hongkong
时间返回就没问题了。
总结:
UTC和
- 要把mysql数据库的时间和javaweb连接mysql的时区统一,比如说数据库使用GMT时间 那么javaweb项目也使用GMT时间 ,存储数据时候也用GMT时间
- 如果数据库连接(项目的数据库url)使用GMT时间,数据库使用GMT+8时间,则存储的时候会自动减去8个小时,读取的时候自动加上8个小时
例如:
现在时间是: 2019-11-21 18:30:32 数据库的存储的时间是:2019-11-21 10:30:32 重新查询读取出来的时间是: 2019-11-21 18:30:32 需要注意的是控制台打印的插入的sql日志的时间为:2019-11-21 18:30:32 所以猜测是mysql进行存储的时候自动减去了8个小时, 而读取的时候自动自动加上了8个小时,前提:是数据库连接(项目的数据库url)使用的是GMT时间,数据库是GMT+8的时间
- 如果数据库连接使用GMT+8时间,数据库使用GMT+8时间,则存储的时候直接存储
例如:
现在时间是: 2019-11-21 18:30:32 数据库的存储的时间是:2019-11-21 18:30:32 重新查询读取出来的时间是: 2019-11-21 18:30:32 控制台打印的插入的sql日志的时间为:2019-11-21 18:30:32