我的表格包含日期时间字段:
`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
?
答案 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
。