我在使用jdbc 的数据库(firebird(中遇到时间戳问题
数据库中的数据
timestamp 1994-10-12T00:00:00.000000000-00:00
我使用python进行测试,结果在数据库中是相同的,但当我使用jdbc(clojure(时
result is 1994-10-11T17:00:00.000000000-00:00
我认为这取决于时区(我在GMT+7(
如何修复?
谢谢。
这个代码
(ns test.core
(:require [clojure.java.jdbc :as jdbc]))
(def firebird-setting {:description "Firebird Database"
:classname "org.firebirdsql.jdbc.FBDriver"
:subprotocol "firebirdsql"
:subname "//localhost:3051//firebird/data/test.fdb"
:user "user"
:password "pass"})
(jdbc/query firebird-setting
"select ts from TestTB")
和结果
({:ts #inst "1994-10-11T17:00:00.000000000-00:00"})
问题是JDBC要求检索时间戳(没有时区信息(,就好像该值在默认(当前(JVM时区中一样。另请参阅是否java.sql.Timestamp时区特定?
这意味着,如果存储在数据库中的值是1994-10-12 00:00:00
,并且JVM时区是GMT+7,那么时间将被检索为1994-10-12 00:00:00+07:00
,与1994-10-11T17:00:00+00:00
相同。
对此的正常解决方案是:
- 更改默认的JVM时区(甚至机器的区域设置配置(,使其为GMT。请仔细考虑此选项,因为这可能会对应用程序产生其他影响
- 将
getTimestamp(int index, Calendar calendar)
与配置了适当时区的Calendar
一起使用 - 使用
getObject(int index, Class clazz)
和LocalDateTime.class
作为参数(如果使用Jaybird 3.0.x(。这将以无时区的java.time.LocalDateTime
检索值,因此没有这些问题 - 使用在默认JVM时区中检索时间的知识,并对其进行适当转换(例如,使用考虑正确区域的日期格式进行渲染(
我不知道Clojure,所以不幸的是,我无法提供Clojure特定的答案。