2013-09-01 7 views
1

У меня здесь странная проблема. Я вызываю даты из базы данных, и я пытаюсь показать даты PostgreSQL, отформатированные как «2013-01-01», для отображения на моем сайте «1 января 2013 года»clj-time всегда возвращает сегодняшнюю дату.

У меня есть следующий код:

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

Приведенный выше код делает то, что я хочу, если я проверить его из РЕПЛ:

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-mdy).

До сих пор я попытался переместить функцию в локальное пространство имен и использовать локализованные значения let.

+0

Вы уверены, что вам нужно unparse, что возвратил дб? В моем собственном использовании clojure.data.sql всегда дает мне фактический объект даты для поля даты в db. – noisesmith

+0

Как я понимаю, вам нужно разобрать то, что возвращается из db - что превращает значение в объект Java, - тогда не разбирайте этот объект. Кажется, что-то вроде петли. Несмотря на это, я не состою в браке с использованием clj-time, поэтому любые альтернативы приветствуются. – dizzystar

ответ

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-библиотек clojure дадут объект даты (в частности, java.sql.Date) для поля даты в db. Это нужно обрабатывать немного иначе, чем строка, чтобы получить что-то хорошее с 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))) 
+0

Работает отлично. Благодарю. Я смотрел на этот материал и думал, что это сработает так же хорошо. Я все еще немного смущен, почему он работает с REPL, но не в реальном приложении. – dizzystar

+0

В приведенном выше примере реплики вы даете ему строку, то, что возвращает db, не является строкой. – noisesmith