Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql clojure.java.jdbc:当处于非utc时区时,如何将postgres日期读取为localdate?_Postgresql_Date_Jdbc_Clojure_Timezone - Fatal编程技术网

Postgresql clojure.java.jdbc:当处于非utc时区时,如何将postgres日期读取为localdate?

Postgresql clojure.java.jdbc:当处于非utc时区时,如何将postgres日期读取为localdate?,postgresql,date,jdbc,clojure,timezone,Postgresql,Date,Jdbc,Clojure,Timezone,当我读取postgres日期类型时,我希望将它们强制转换为joda time LocalDates(或新的java.time LocalDates)。 这是因为postgres日期没有时区信息,所以我不希望java或clojure对象以某种方式添加它 这是我为此设置的IResultSetReadColumn协议扩展: (扩展协议clojure.java.jdbc/IResultSetReadColumn java.sql.Date (结果集读取列[v\u rsmeta\u idx] (tc/至当

当我读取postgres日期类型时,我希望将它们强制转换为joda time LocalDates(或新的java.time LocalDates)。 这是因为postgres日期没有时区信息,所以我不希望java或clojure对象以某种方式添加它

这是我为此设置的IResultSetReadColumn协议扩展:

(扩展协议clojure.java.jdbc/IResultSetReadColumn
java.sql.Date
(结果集读取列[v\u rsmeta\u idx]
(tc/至当地日期v)))
但是,当我尝试使用它时,我得到了错误的结果:

(日期时区/getDefault)
=>#对象[org.joda.time.tz.CachedDateTimeZone 0x60470ff“欧洲/斯德哥尔摩”]
(jdbc/query db/db[“显示时区”])
=>({:时区“欧洲/斯德哥尔摩”})
(jdbc/query db/db[“选择‘2020-01-01’::日期”])
=>({:date#object[org.joda.time.LocalDate 0x75081795“2019-12-31”]});啊!!它改变了日期!
我怀疑这是由于将日期转换为java.sql.date造成的,java.sql.date中包含时区信息。有没有办法直接阅读博士后的日期来避免这种情况?我已经找到了,但是我不知道如何在clojure.java.jdbc中实现它

基本上:
如果我的默认时区不是UTC,有没有办法从数据库中取出我的postgres日期而不把它们弄乱?

我现在想好了怎么做:

(定义sql日期->本地日期[v]
;将java.sql.Date转换为LocalDate。
;LocalDates没有任何时区信息-可能有点不直观。
;postgres日期类型也不相同。
;
;不幸的是,java.sql.Date有一个时间组件,
;如果我们照原样传递,这会引起很多问题。
;其工作原理是:
;1.postgres JDBC驱动程序将postgres日期读取为java.sql.date,
;通过将jav.sql.Date时间戳设置为00.00
;中的博士后日期
;JVM默认时区(DateTimeZone/getDefault)。
;
;2..toLocalDate将java.sql.Date转换为java.time.LocalDate
;在JVM默认时区中(DateTimeZone/getDefault)。
;
;3.然后我们将java.time.LocalDate转换为joda time LocalDate,
;因为这正是《华尔街日报》的用场。
;
;因此,因为我们将两个日期->时间戳->日期转换为同一格式
;时区,一切都平衡了。
;
(让[java time localdate(.toLocalDate v)]
(时间/本地日期(.getYear java time localdate)
(.getValue(.getMonth java time localdate))
(.getDayOfMonth java时间localdate)))

最重要的是不要使用clj time.convere的
到localtime
函数。我不知道它是干什么的,但不管怎样,当涉及时区时,它会把一天搞得一团糟。

这是否回答了你的问题?