我这里有一个奇怪的问题。我正在从数据库调用日期,我试图显示PostgreSQL日期,格式为“2013-01-01”,在我的网站上显示为“2013年1月1日”
我有以下代码:
(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=>
但我在网页上得到的是“2013年9月1日”(截至本文撰写时),没有其他日期。我在数据库中没有“2013-09-01”。
我从(coerse-mdy)的数据库中返回了原始日期值,并且它返回了正确的日期,所以我能够找到最接近这个问题的是(to-mdy)或(强迫-MDY)。
到目前为止,我已尝试将函数移动到本地命名空间并使用本地化的let值。
答案 0 :(得分:1)
将clj-time
与数据库一起使用时,我发现我需要使用to-sql-date
命名空间中的from-sql-date
和coerce
函数(来源:{{ 3}})
这是因为,正如@noisesmith在他的评论中提到的,大多数clojure sql库将为db中的日期字段提供日期对象(特别是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)))