添加到 postgresql 后的 Clojure 更改日期
Clojure change date after add to postgresql
我在使用 clojure 和 postgresql 时遇到问题。
例如,当我将“2017-06-27”插入 DB(日期格式列)时,它会保存“2017-06-26”,当我 select 这个结果时,返回的对象是#inst "2017-06-28T03:00:00.000-00:00"
最奇怪的是,当我 运行 在我的本地机器上测试时会发生这种情况,因为我已经创建了一个 docker 设置并且相同的代码可以完美运行。
代码如下:
(ns balances.db
(:require [clj-time.coerce :as c]
[clj-time.format :as f]))
; Function to convert data objects from queries to string
(defn db-to-str [date]
(f/unparse (f/formatters :date) (c/from-sql-date date))
)
; Function to convert string to data objetcs that can be inserted in db
(defn str-to-db [date]
(c/to-sql-date date)
)
(ns balances.operation
(:require [clojure.java.jdbc :as jdbc]
[balances.db :refer [db-spec]]))
(defn create-operation [accountid amount description operationdate]
(jdbc/insert! db-spec :operations {
:accountid accountid
:amount amount
:description description
:operationdate operationdate
})
)
(ns balances.operation-test
(:use clojure.test
ring.mock.request
balances.core-test)
(:require [balances.operation :as operation]
[balances.db :as db]))
(use-fixtures :each db/clear-db-fixture)
(deftest operation
(testing "create operation"
(let [op (first (operation/create-operation 1 100 "Test operation" (db/str-to-db "2017-06-27")))]
(is (= "2017-06-27" (db/db-to-str (op :operationdate))))
)
)
)
在本地环境,创建操作测试失败,返回:
expected: (= "2017-06-27" (db/db-to-str (op :operationdate)))
actual: (not (= "2017-06-27" "2017-06-26"))
在 docker 环境下测试通过。
听起来您的本地环境与您的数据库和 docker 环境具有不同的语言环境 and/or 时区。
在每个环境中打开一个 Clojure REPL 并检查 JVM Locale 设置为:
(str (java.util.Locale/getDefault))
同时在每个环境 (bash?) 上打开终端 shell 并输入 date
以查看 OS 时区设置的内容。
如果其中任何一个不同,那么您将知道您需要同步它们并更正至少一个 JVM 或 OS 环境以使用相同的时区和区域设置。
我在使用 clojure 和 postgresql 时遇到问题。
例如,当我将“2017-06-27”插入 DB(日期格式列)时,它会保存“2017-06-26”,当我 select 这个结果时,返回的对象是#inst "2017-06-28T03:00:00.000-00:00"
最奇怪的是,当我 运行 在我的本地机器上测试时会发生这种情况,因为我已经创建了一个 docker 设置并且相同的代码可以完美运行。
代码如下:
(ns balances.db
(:require [clj-time.coerce :as c]
[clj-time.format :as f]))
; Function to convert data objects from queries to string
(defn db-to-str [date]
(f/unparse (f/formatters :date) (c/from-sql-date date))
)
; Function to convert string to data objetcs that can be inserted in db
(defn str-to-db [date]
(c/to-sql-date date)
)
(ns balances.operation
(:require [clojure.java.jdbc :as jdbc]
[balances.db :refer [db-spec]]))
(defn create-operation [accountid amount description operationdate]
(jdbc/insert! db-spec :operations {
:accountid accountid
:amount amount
:description description
:operationdate operationdate
})
)
(ns balances.operation-test
(:use clojure.test
ring.mock.request
balances.core-test)
(:require [balances.operation :as operation]
[balances.db :as db]))
(use-fixtures :each db/clear-db-fixture)
(deftest operation
(testing "create operation"
(let [op (first (operation/create-operation 1 100 "Test operation" (db/str-to-db "2017-06-27")))]
(is (= "2017-06-27" (db/db-to-str (op :operationdate))))
)
)
)
在本地环境,创建操作测试失败,返回:
expected: (= "2017-06-27" (db/db-to-str (op :operationdate)))
actual: (not (= "2017-06-27" "2017-06-26"))
在 docker 环境下测试通过。
听起来您的本地环境与您的数据库和 docker 环境具有不同的语言环境 and/or 时区。
在每个环境中打开一个 Clojure REPL 并检查 JVM Locale 设置为:
(str (java.util.Locale/getDefault))
同时在每个环境 (bash?) 上打开终端 shell 并输入 date
以查看 OS 时区设置的内容。
如果其中任何一个不同,那么您将知道您需要同步它们并更正至少一个 JVM 或 OS 环境以使用相同的时区和区域设置。