sql数据库的日期-时间结果在clojurejdbc中是不一样的



我在使用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相同。

对此的正常解决方案是:

  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检索值,因此没有这些问题
  4. 使用在默认JVM时区中检索时间的知识,并对其进行适当转换(例如,使用考虑正确区域的日期格式进行渲染(

我不知道Clojure,所以不幸的是,我无法提供Clojure特定的答案。

相关内容

  • 没有找到相关文章

最新更新