【发布时间】:2011-06-11 11:17:19
【问题描述】:
我有一个 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 保存我的当前时间,但实际上它保存了我的时区的当前时间。
如果我将存储过程更改为获取字符串,它可以工作...
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
...
sproc.setString(1, dateFormat.format(now));
但我宁愿在存储过程中使用正确的类型。
如果我绕过存储过程也可以,但又不是我的首选解决方案...
String sql = "INSERT INTO TzTest VALUES('" + dateFormat.format(now) + "') ;
对于原始存储过程,如果我在存储过程和表中使用 TIMESTAMP 数据类型,我也会遇到同样的问题,这对于 UTC 中的服务器来说并不奇怪,因为任何特定于 MySQL TIMESTAMP 的时区转换都应该是 noops。
从 MySQL Workbench 连接调用存储过程可以正常工作,例如
CALL TzTestInsert(UTC_TIMESTAMP());
似乎问题出在 JDBC 中。我查看了各种时区连接参数,但没有发现任何影响。
我一定错过了一些基本的东西 - 很多人都这样做,对吧?
【问题讨论】:
标签: mysql stored-procedures jdbc timezone