我有一个奇怪的问题。我从数据库中调用日期,并试图显示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值。
在数据库中使用clj-time
时,我发现我需要使用coerce
命名空间中的函数to-sql-date
和from-sql-date
(来源:https://github.com/clj-time/clj-time/blob/master/src/clj_time/coerce.clj)
这是因为,正如@noisesmith在他的评论中提到的,大多数clojure sql库都会为数据库中的日期字段提供一个日期对象(特别是java.sql.date)。这需要与字符串略有不同,以便获得与clj时间配合良好的内容。
假设你的约会对象确实是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)))