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值。

在数据库中使用clj-time时,我发现我需要使用coerce命名空间中的函数to-sql-datefrom-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)))

相关内容

  • 没有找到相关文章

最新更新