gpt4 book ai didi

mysql - MySQL 和 clj-time 的时区问题

转载 作者:可可西里 更新时间:2023-11-01 07:48:10 24 4
gpt4 key购买 nike

我在 MySQL 中有一个表。

创建表演示 ( 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"]

关于mysql - MySQL 和 clj-time 的时区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25123054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com