sql数据库中的日期时间结果与clojure jdbc

时间:2018-07-18 15:54:44

标签: jdbc clojure firebird jaybird

我在使用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"})

1 个答案:

答案 0 :(得分:4)

问题是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,与{{ 1}}。

通常的解决方法是:

  1. 更改默认的JVM时区(甚至是计算机的语言环境配置),因此它是GMT。请仔细考虑此选项,因为这可能会对您的应用程序产生其他影响。
  2. 1994-10-11T17:00:00+00:00与配置了适当时区的getTimestamp(int index, Calendar calendar)一起使用
  3. 使用CalendargetObject(int index, Class clazz)作为参数(如果使用Jaybird 3.0.x)。这将检索值为LocalDateTime.class的值,该值是无时区的,因此没有这些问题。
  4. 使用以下知识:在默认的JVM时区中检索时间,并进行适当的转换(例如,通过使用考虑了正确时区的日期格式进行渲染)。

我不了解Clojure,因此很遗憾,我无法提供Clojure的特定答案。