如果我调用我的应用程序:
System.currentTimeMillis()
结果将是:1536842771599, :GMT:2018年9月13日,星期四,12:46:11.599 PM或在我的本地 :,星期四,2018年9月13日下午3:46:11.599 GMT + 03:00 DST
如果执行以下操作,请在本地安装的Oracle数据库上进行选择:
select CAST(sys_extract_utc(SYSTIMESTAMP) AS DATE) from dual;
我通过以下JdbcTemplate代码获得:
jdbc.queryForObject(sqlCommand, new Object[0], Timestamp.class);
我认为这是错误的,因为时间戳通常表示本地化时间。此外,如果我打电话:
myResult.getTime()
要获取长值,这会将我的时间(大约12.46 PM)转换为值1536831971599,该值实际上是:GMT:2018年9月13日,星期四,9:46:11.599 AM。
显然这不好,因为它比我的实际本地时间晚2 * GMT + 03:00(6小时),比数据库的UTC时间晚GMT + 03:00(3小时)。
我做错了什么?到目前为止,我唯一的结论是避免对数据库执行 sys_extract_utc ,并让数据库向我返回本地时间,当我在Timestamp实例上调用getTime时,该本地时间将转换为UTC时间。
对此有任何解释吗?
P.S。 基于java.sql.Timestamp为UTC的答案,我附上了调试器显示给我的屏幕截图,这是错误的,因为它认为结果为UTC为GMT + 03:00。因此,它显示我的时间为8.26 + 03:00。我的当地时间是11.26。如果我在这个时间戳实例上调用getTime,则会得到一个长整型值,如果我将其放入https://www.epochconverter.com/,则会得到GMT +03:00 DST + 03:00 DST或星期五,星期五,2018年9月14日星期五, 2018年9月14日上午5:26:06,比我实际拥有的UTC时间晚了3个小时!
P.S.2 我使用Spring JDBC 4.2.5-RELEASE。不能将它与Instant一起使用,它会引发无法将Timestamp转换为Instant的异常,因为它期望从Number派生出来。不幸的是,现在我无法更改此JDBC甚至版本。