来自 sql 数据库的日期时间结果在 clojure jdbc 中不相同
date time result from sql database is not same in clojure jdbc
我在 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
,它是无时区的,因此有 none 这些问题。
- 利用在默认 JVM 时区中检索时间的知识并适当地转换它(例如,通过使用考虑正确时区的日期格式呈现它)。
我不懂 Clojure,所以很遗憾我无法提供 Clojure 特定的答案。
我在 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
,它是无时区的,因此有 none 这些问题。 - 利用在默认 JVM 时区中检索时间的知识并适当地转换它(例如,通过使用考虑正确时区的日期格式呈现它)。
我不懂 Clojure,所以很遗憾我无法提供 Clojure 特定的答案。