3

这是我的Clojurescript函数,

(defn message-list [messages]
  (println messages) ;; stmt#1
  [:ul.messages
   (for [{:keys [timestamp message name]} @messages]
     ^{:key timestamp}
     [:li
      [:time (.toLocaleString timestamp)] ;; stmt#2
      [:p message]
      [:p " - " name]])])

stmt#1正在打印,

#<Atom: [{:id 1, :name Adeel Ansari, :message Hello, from the other side., 
          :timestamp #object[Transit$TaggedValue [TaggedValue: LocalDateTime, 2020-01-13T18:19:50.552]]}]>

并且stmt#2正在打印,

[TaggedValue: LocalDateTime, 2020-01-13T18:19:50.552]

现在,我想将其打印为13/01/2020 18:19; 我应该怎么做?我不知道如何解码标记值。

4

2 回答 2

4

您可以从TaggedValueusing获取值.-rep,然后可以String使用某个库解析该值。

例如,您可以使用cljc.java-time解析日期,如下所示:

(let [tv (t/tagged-value "LocalDateTime" "2019-01-01T11:22:33.123")]
    (cljc.java-time.local-date-time/parse (.-rep tv))) => #object[LocalDateTime 2019-01-01T11:22:33.123]

或者你可以使用Tick;那么你的代码看起来像,

(ns xx.yy.zz
  (:require ..
            [tick.locale-en-us]
            [tick.alpha.api :as t]
            ..
            ))
...
  (defn message-list [messages]
    ...
       [:li
        [:time (t/format (t/formatter "dd/MM/yyyy HH:mm") (t/parse (.-rep timestamp)))]   
        ...]
    ...)
...
于 2020-01-16T14:58:13.237 回答
3

理想情况下,您将直接提供一个处理函数来传输,以便它可以在读取时转换值。首先必须在服务器上执行相同的操作才能创建 TaggedValue。

在构建阅读器时,您可以提供

:handlers {"LocalDateTime" (fn [string-val] (parse-the-timestamp string-val))}

格式化应延迟到需要时,但理想情况下 TaggedValue 不应使其脱离读取功能,因为它将您的代码与传输实现耦合。

于 2020-01-17T09:54:47.643 回答