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)))
Другие вопросы по тегам