【问题标题】:Why does getTimestamp on a DateTime field return a different result than selecting unix_timestamp?为什么 DateTime 字段上的 getTimestamp 返回的结果与选择 unix_timestamp 不同?
【发布时间】:2016-01-21 01:05:27
【问题描述】:

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

`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

【问题讨论】:

标签: java mysql sql datetime jdbc


【解决方案1】:

需要了解的一些事情 -

  • 首先,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2012-07-28
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多