У меня есть таблица в MySQL.Проблемы с часовым поясом с MySQL и clj-time
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 |
+---------------------+
Когда я выбираю с Кормой (я не представляю Корма делает что-либо отношение сверху 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)
?
Вы должны быть хранящей временные метки, UTC, и преобразование их в локальный, когда вам нужно, чтобы отобразить их. –
или хранить unix timestamp как долго – edbond