1

我这里有一个奇怪的问题。我正在从数据库中调用日期,并尝试显示格式为“2013-01-01”的 PostgreSQL 日期,以在我的网站上显示为“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) 或 (coerce- mdy)。

到目前为止,我已经尝试将函数移动到本地命名空间并使用本地化的 let 值。

4

1 回答 1

1

与数据库一起使用clj-time时,我发现我需要在命名空间to-sql-date中使用函数(来源:https ://github.com/clj-time/clj-time/blob/master/src/clj_time/coerce .clj )from-sql-datecoerce

这是因为,正如@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)))
于 2013-09-02T11:03:10.590 回答