MySQL和cli -time的时区问题



我在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))}))

从我的MySQL客户端,它看起来像正确的值已经进入:

mysql> select * from demo;
+---------------------+
| theDate             |
+---------------------+
| 2014-01-01 00:00:00 |
| 2014-06-01 00:00:00 |
+---------------------+

当我选择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"}]

当我选择日期时:

(map #(-> % :theDate coerce/from-sql-date t/month) (k/select :demo))
(1 5)

而我希望得到(1 6)(我故意把日期放在一个月的边界上来说明)。当我使用date而不是datetime MySQL类型时,也会发生同样的事情。

我错过了什么?如何插入[(t/date-time 2014 01 01) (t/date-time 2014 06 01)]并返回(1 6) ?

您得到的结果取决于JVM的默认时区。您可以通过主机操作系统提供的任何机制来修复这个问题。但根据我的经验,通常更好的做法是显式地强制JVM使用已知值。

这是通过在命令行或leiningen project.clj

中的属性实现的。
:jvm-opts ["-Duser.timezone=UTC"]

我们也遇到了这种情况,最后使用korma的exec-raw并指定:

at time zone 'utc' as theData

返回正确的时区。

相关内容

  • 没有找到相关文章

最新更新