clj-time总是返回今天的日期。

时间:2013-09-01 23:00:23

标签: clojure clj-time

我这里有一个奇怪的问题。我正在从数据库调用日期,我试图显示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值。

1 个答案:

答案 0 :(得分:1)

clj-time与数据库一起使用时,我发现我需要使用to-sql-date命名空间中的from-sql-datecoerce函数(来源:{{ 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)))