来自 sql 数据库的日期时间结果在 clojure jdbc 中不相同

date time result from sql database is not same in clojure jdbc

我在 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.

正常的解决方法是:

  1. 更改默认的 JVM 时区(或什至您计算机的区域设置),使其为 GMT。请仔细考虑此选项,因为这会对您的应用程序产生其他影响。
  2. getTimestamp(int index, Calendar calendar) 与配置了适当时区的 Calendar 一起使用
  3. 使用 getObject(int index, Class clazz)LocalDateTime.class 作为参数(如果您使用 Jaybird 3.0.x)。这会将值检索为 java.time.LocalDateTime,它是无时区的,因此有 none 这些问题。
  4. 利用在默认 JVM 时区中检索时间的知识并适当地转换它(例如,通过使用考虑正确时区的日期格式呈现它)。

我不懂 Clojure,所以很遗憾我无法提供 Clojure 特定的答案。