我将MySQL服务器设置为UTC(@@ global.time_zone ='+ 00:00')和一个带有DATETIME列的表,其中我以UTC格式存储日期。当我通过JDBC调用存储过程时,我遇到了生成UTC日期的问题。例如:
java.util.Date now = new java.util.Date();
sproc = conn.prepareCall("{call TzTestInsert(?)}");
sproc.setTimestamp(1, new java.sql.Timestamp(now.getTime()), Calendar.getInstance(TimeZone.getTimeZone("GMT+00:00")));
sproc.execute();
TzTestInsert sproc只需要一个DATETIME并将其插入表中。
我希望数据库现在以UTC格式保存当前时间,但实际上它保留了我的时区的当前时间。
如果我改变了sproc以取一个字符串就可以了......
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
...
sproc.setString(1, dateFormat.format(now));
但我宁愿在sproc中使用正确的类型。
如果我绕过了sproc,也可以工作,但同样不是我首选的解决方案......
String sql = "INSERT INTO TzTest VALUES('" + dateFormat.format(now) + "') ;
对于原始的sproc,如果我在sproc和table中使用TIMESTAMP数据类型,我会遇到同样的问题,这对于UTC中的服务器来说并不奇怪,因为任何特定于MySQL TIMESTAMP的时区转换都应该是noops。
从MySQL Workbench连接调用sproc工作正常,例如
CALL TzTestInsert(UTC_TIMESTAMP());
似乎问题出在JDBC中。我查看了各种时区连接参数,但没有找到任何有意义的连接参数。
我必须遗漏一些基本的东西 - 很多人这样做,对吗?
答案 0 :(得分:0)
解决方案是传递JDBC驱动程序“useLegacyDatetimeCode = false”。请参阅mysql错误http://bugs.mysql.com/bug.php?id=15604
看起来他们将旧代码留在驱动程序中以实现向后兼容。