我在使用 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 特定的答案。
关于jdbc - 来自sql数据库的日期时间结果在clojure jdbc中不相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51406326/