5

我想将时间戳保存到数据库中,而不会被 jdbc 驱动程序转换为本地时区。目前只有 MySQL 和 PostgreSQL 对我很重要,但如果有独立于数据库的解决方案,我将不胜感激。

例子:

// i want that to be saved as 1970-01-01 00:00:00
TimeStamp ts = new java.sql.Timestamp(0);

// gets transformed to local time by jdbc driver (in my case to 1970-01-01 01:00:00)
st.setTimestamp(0, new java.sql.Timestamp(0));

// only works using postgres (mysql connector seems to ignore the calendar)
// postgres => 1970-01-01 00:00:00
// mysql => 1970-01-01 01:00:0
Calendar calutc = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
st.setTimestamp(0, new java.sql.Timestamp(0), utccal);

我已经尝试计算转换为正确值的时间戳值(例如,我的时区中的 -3600000 => 1970-01-01 00:00:00),但这不适用于临近日期的 postgres光节约时间的变化。

4

2 回答 2

13

我找到了解决方案。MySQL 在其 JDBC 连接器中有一个错误,它忽略了提供给 setTimestamp/getTimestamp 的 Calendar 对象。他们修复了连接器版本 5.1.5 中的错误,但旧的(不正确的)行为仍然是默认行为。要使用正确的代码,您必须将参数“useLegacyDatetimeCode=false”传递给连接器 url。

更多信息: http ://bugs.mysql.com/bug.php?id=15604

于 2013-03-05T15:22:05.507 回答
1

Java 中的日期和时间戳与时区无关。新的 Timestamp(0) 确实对应于 UTC 中的 1970-01-01 00:00:00。您必须使用 SimpleDateFormat 并在其上设置所需的时区以直观地检查您的日期。当使用 System.out.println 打印出来时,从时间戳中减去一个长常量以使其看起来“正确”是非常错误的。

使用数据库时,您可以选择日期/时间/时间戳的数据类型。其中一些支持时区信息,而另一些则不支持。如果您选择在数据库中使用时区处理,则必须详细了解它。如果您想绕过它,您可以选择将数据库中的日期/时间/时间戳存储为字符串,并在您的 Java 代码中进行所有格式化。

于 2013-03-04T20:37:34.840 回答