我在使用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时区中一样。另见Is java.sql.Timestamp timezone specific?

这意味着,如果存储在数据库中的值为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的特定答案。

10-07 19:27
查看更多