getTimestamp()在MySQL JDBC连接器中执行两次时区转换?

yeg*_*256 8 java mysql jdbc

我有类型的列DATETIME室内用的值2012-05-07 19:59:12在MySQL数据库.我正在尝试从DB中检索此值,假设它存储在UTC时区中:

Calendar cal = Calendar.getInstance(new SimpleTimeZone(0, "UTC"));
Date date = resultSet.getTimestamp(1, cal);
System.out.println(date);
Run Code Online (Sandbox Code Playgroud)

它输出(CEST是我当地的时区,比UTC早2小时):

Mon May 07 23:59:12 CEST 2012
Run Code Online (Sandbox Code Playgroud)

预期价值是:

Mon May 07 21:59:12 CEST 2012
Run Code Online (Sandbox Code Playgroud)

我在JDBC URL中使用这三个参数(Europe/Berlin与以下相同CEST):

..&useGmtMillisForDatetimes=true&useTimezone=true&serverTimezone=Europe/Berlin
Run Code Online (Sandbox Code Playgroud)

是我的缺陷还是应该在JDBC驱动程序中另外配置一些东西?我正在使用mysql:mysql-connector-java:5.1.20.

yeg*_*256 13

使用这些JDBC URL参数,它可以工作:

useGmtMillisForDatetimes=true
useJDBCCompliantTimezoneShift=true
useLegacyDate?timeCode=false
useTimezone=true
serverTimezone=UTC
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,对我来说很完美.注意:你有两个(不可见)0×00"useLegacy"和"DatetimeCode",这意味着这不会工作,如果有人复制粘贴到一个属性文件之间的字符.我做到了这一点,追踪非常困难.以防其他人试图这样做. (2认同)
  • MySQL连接器[参考](http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html)表示属性`useJDBCCompliantTimezoneShift`和`useTimezone`是互斥的.我成功使用`useTimezone = false`. (2认同)