今天程序中需要用到对数据库时间的获取,数据库在美国,用的是UTC时区,客户端在中国,用的时GMT+8时区,但是发现用getTime和getTimestamp时候获取日期时得到的时间不一致。于是就看了下JDBC的源码了解了这个Bug或者说Feature的原理。
就是getTimestamp这个函数比如在数据库连接的url里面加入useTimezone = true这个参数才可以转换时区,否则传入的时区参数是无效的。然而getDate这个函数,是数据库连接的url里设置的时区对它都是无效的,需要再单独传入时区参数才可以
#
详细可以参考官方文档,比如Mysql的官方文档
在数据库url中会有一些参数,其中关于时区的有如下三个:
serverTimezone
useTimeZone
useLegacyDatetimeCode
serverTimezone是用来服务器时区的【如果不设置就选择服务器的默认时区】
useTimeZone是用来设置时区转换的,当其为true时,就会开启服务器和客户端之间的时区转换,而其只有当useLegacyDatetimeCode = true时才回生效
useLegacyDatetimeCode这个参数是一个开关参数,默认为true,但是当其设置为false时,"useTimezone," "useJDBCCompliantTimezoneShift," "useGmtMillisForDatetimes," and "useFastDateParsing."
这几个参数都会变的无效化。
getTimestamp函数中,其中在最开始会传入一个时区的参数,
public Timestamp getTimestamp(int colum