我在使用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"})
答案 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}}。
通常的解决方法是:
1994-10-11T17:00:00+00:00
与配置了适当时区的getTimestamp(int index, Calendar calendar)
一起使用Calendar
和getObject(int index, Class clazz)
作为参数(如果使用Jaybird 3.0.x)。这将检索值为LocalDateTime.class
的值,该值是无时区的,因此没有这些问题。我不了解Clojure,因此很遗憾,我无法提供Clojure的特定答案。