Clojure изменить дату после добавления в postgresql

У меня проблема с clojure и postgresql.

Когда я вставляю, например, "2017-06-27" в БД (столбец формата даты), он сохраняет "2017-06-26", и когда я выбираю этот результат, возвращается объект #inst 2017-06-28T03:00:00.000-00:00"

Самое странное, что это происходит, когда я запускаю тесты на своем локальном компьютере, потому что я создал настройку докера и там тот же код работает отлично.

Вот коды:

(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))))
      )
    )
)

В локальной среде тест create-operation завершается неудачно, возвращая:

expected: (= "2017-06-27" (db/db-to-str (op :operationdate)))
  actual: (not (= "2017-06-27" "2017-06-26"))

В среде докеров тестовый пропуск.

1 ответ

Решение

Похоже, ваша локальная среда отличается от локали и / или часового пояса для вашей базы данных и среды докера.

Откройте Repl Clojure в каждой среде и проверьте, установлен ли языковой стандарт JVM:

(str (java.util.Locale/getDefault))

Также откройте оболочку терминала в каждой среде (bash?) И введите date чтобы увидеть, какой часовой пояс ОС установлен.

Если какой-либо из них отличается, вы будете знать, что вам нужно синхронизировать их и исправить хотя бы одну из сред JVM или ОС, чтобы использовать один и тот же часовой пояс и локаль.

Другие вопросы по тегам