为什么DateTime字段上的getTimestamp返回的结果与选择unix_timestamp不同?

时间:2015-10-21 21:16:15

标签: java mysql sql datetime jdbc

我的表格包含日期时间字段:

`RunEndTime` datetime DEFAULT NULL,

它作为UTC时间戳插入:

statement.setTimestamp(RUN_END_TIME, runStartTime, UTC_CALENDAR);

我们的地方

Calendar UTC_CALENDAR = Calendar.getInstance(TimeZone.getTimeZone("GMT"));

当我使用SQL查询来实现

的效果时
SELECT RunEndTime, unix_timestamp(RunEndTime) ...

我得到以下不同的结果:

rs.getTimestamp(1);               // 1445423199000
rs.getTimestamp(1, UTC_CALENDAR); // 1445423199000
rs.getLong(2);                    // 1445408799

选择unix_timestamp会得到不同的结果,而且这是唯一准确的结果。另外两个是EDT,它是客户端程序的位置。如何正确使用getTimestamp

1 个答案:

答案 0 :(得分:0)

要理解的一些事项 -

  • 首先,DateTime个对象是不包含时区的字符串。它们不是时间戳。当您致电unix_timestamp时,函数unix_timestamp会隐式使用时区,然后使用DateTime和时区计算自纪元以来的秒数。服务器的时区可能设置为UTC,但如果您使用SET SESSION time_zone = '+04:00',然后拨打unix_timestamp,您将得到不同的答案。换句话说,unix_timestamp不输出与DateTime关联的规范时间戳,因为没有与DateTime关联的规范时间戳。 DateTime只是一个时区不知道的字符串。这与问题相关,但在今天研究之前我无法理解,包括。
  • 话虽如此,问题实际上发生在rs.getTimestamp电话的深处。这是MySQL(或JDBC或其他)中的错误。解决此问题的方法是在连接数据库时添加useLegacyDatetimeCode=false