我在使用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的特定答案。