Joe*_*Joe 3 mysql timezone jdbc clojure sqlkorma
我有一个MySQL表.
create table demo ( theDate datetime );
我插入两个日期,一个在夏令时,一个不在.
(require '[clj-time.core :as t])
(require '[clj-time.coerce :as coerce])
(require '[korma.core :as k])
(k/insert :demo (values {:theDate (coerce/to-sql-date (t/date-time 2014 01 01))}))
(k/insert :demo (values {:theDate (coerce/to-sql-date (t/date-time 2014 06 01))}))
Run Code Online (Sandbox Code Playgroud)
从我的MySQL客户端看起来正确的值已经进入:
mysql> select * from demo;
+---------------------+
| theDate |
+---------------------+
| 2014-01-01 00:00:00 |
| 2014-06-01 00:00:00 |
+---------------------+
Run Code Online (Sandbox Code Playgroud)
当我选择Korma(我不认为Korma在JDBC之上做任何相关的事情)时,我在非夏令时日期得到时区差异.
=> (k/select :demo)
[{:theDate #inst "2014-01-01T00:00:00.000000000-00:00"}
{:theDate #inst "2014-05-31T23:00:00.000000000-00:00"}]
Run Code Online (Sandbox Code Playgroud)
当我选择日期时:
(map #(-> % :theDate coerce/from-sql-date t/month) (k/select :demo))
(1 5)
Run Code Online (Sandbox Code Playgroud)
虽然我本来期望得到(1 6)(我故意把日期放在一个月边界来说明).当我使用date而不是datetimeMySQL类型时,会发生同样的事情.
我错过了什么?如何插入[(t/date-time 2014 01 01) (t/date-time 2014 06 01)]和取回(1 6)?
sw1*_*1nn 10
您获得的结果取决于JVM的默认时区.您可以通过主机操作系统为您提供的任何机制来解决这个问题.但根据我的经验,通常最好将JVM明确强制为已知值.
这是通过命令行或leiningen中的属性实现的 project.clj
:jvm-opts ["-Duser.timezone=UTC"]
Run Code Online (Sandbox Code Playgroud)