clj-time всегда возвращает сегодняшнюю дату.
У меня здесь странная проблема. Я вызываю даты из базы данных и пытаюсь показать даты PostgreSQL, отформатированные как "2013-01-01", для отображения на моем сайте как "1 января 2013"
У меня есть следующий код:
(ns mr.layouts
(:require
[clj-time.format :as ctf]))
(def to-mdy (ctf/formatter "MMMM d, yyyy"))
(defn coerce-mdy [sd]
(ctf/unparse to-mdy (ctf/parse sd)))
Вызов в базу данных выглядит так:
(layouts/coerce-mdy startdate)
Приведенный выше код делает то, что я хочу, если я проверяю его из REPL:
mr.handler=> (use 'mr.layouts)
nil
mr.handler=> (require '[clj-time.format :as ctf])
nil
mr.handler=> (coerce-mdy "2012-01-01")
"January 1, 2012"
mr.handler=> (coerce-mdy "2014-10-04")
"October 4, 2014"
mr.handler=>
Но то, что я получаю на веб-странице, это "1 сентября 2013 года" (сегодня на момент написания статьи) и никаких других дат. У меня нет "2013-09-01" в базе данных.
Я возвратил необработанное значение даты из базы данных из (coerse-mdy), и оно возвращает правильную дату, поэтому наиболее близким, который мне удалось выделить, является либо (to-mdy), либо (coerce- МДГ).
До сих пор я пытался переместить функцию в локальное пространство имен и использовать локализованные значения let.
1 ответ
Когда используешь clj-time
с базой данных, я обнаружил, что мне нужно использовать функции to-sql-date
а также from-sql-date
в coerce
пространство имен (источник здесь: https://github.com/clj-time/clj-time/blob/master/src/clj_time/coerce.clj)
Это потому, что, как @noisesmith упомянул в своем комментарии, большинство библиотек sql cloure sql предоставляют объект даты (в частности, java.sql.Date) для поля даты в БД. Это нужно трактовать немного иначе, чем строку, чтобы получить что-то, что хорошо играет с clj-time.
Предполагая, что ваша дата действительно является java.sql.Date, следующее должно помочь...
(ns mr.layouts
(:require [clj-time.format :as ctf]
[clj-time.coerce :as coerce]))
(def to-mdy (ctf/formatter "MMMM d, yyyy"))
(defn coerce-mdy [sd]
(ctf/unparse to-mdy (coerce/from-sql-date sd)))