gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:54:51 24 4
gpt4 key购买 nike

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

`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

最佳答案

一些需要理解的事情 -

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

关于java - 为什么 DateTime 字段上的 getTimestamp 返回的结果与选择 unix_timestamp 的结果不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33269396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com