JDBC / MySQL的:总是使用UTC保存时间戳(JDBC/MySQL: Save timest

2019-07-20 22:58发布

我想保存一个时间戳到数据库,而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的当天日期附近工作光节约时间的变化。

Answer 1:

我找到了解决办法。 在MySQL JDBC的连接器有一个bug无视提供Calendar对象的setTimestamp / getTimestamp。 他们固定版本的bug连接器,但是旧的(不正确的)行为5.1.5仍是默认行为。 使用正确的代码,你必须通过参数“useLegacyDatetimeCode =假”到连接器的URL。

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



Answer 2:

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

当使用一个数据库,你的数据类型,日期/时间/时间戳的选择。 他们中的一些支持时区信息和一些 - 没有。 如果您选择使用的时区处理您的数据库中,你必须了解它在细节。 如果你想绕过它,你必须在数据库中存储的字符串日期/时间/时间戳和做在Java代码中的所有格式的选项。



文章来源: JDBC/MySQL: Save timestamp always using UTC