2015-09-10 25 views

回答

5

一種可能的實現可能是這樣的:

注意,我已使用clj-time/clj-time · GitHub庫。

(require '[clj-time.core :as t]) 

(defn time-ago [time] 
    (let [units [{:name "second" :limit 60 :in-second 1} 
       {:name "minute" :limit 3600 :in-second 60} 
       {:name "hour" :limit 86400 :in-second 3600} 
       {:name "day" :limit 604800 :in-second 86400} 
       {:name "week" :limit 2629743 :in-second 604800} 
       {:name "month" :limit 31556926 :in-second 2629743} 
       {:name "year" :limit nil :in-second 31556926}] 
     diff (t/in-seconds (t/interval time (t/now)))] 
    (if (< diff 5) 
     "just now" 
     (let [unit (first (drop-while #(or (>= diff (:limit %)) 
             (not (:limit %))) 
            units))] 
     (-> (/ diff (:in-second unit)) 
      Math/floor 
      int 
      (#(str % " " (:name unit) (when (> % 1) "s") " ago"))))))) 

用法示例:

(time-ago (t/minus (t/now) (t/days 15))) 
=> "2 weeks ago" 

(time-ago (t/minus (t/now) (t/seconds 45))) 
=> "45 seconds ago" 

(time-ago (t/minus (t/now) (t/seconds 1))) 
=> "just now" 
3

如果您在使用JVM Clojure的,可以考慮使用PrettyTime庫。建議使用該庫在Java中實現「時間前」here

要使用PrettyTime庫從Clojure的,先添加以下的:dependencies向量project.clj:

[org.ocpsoft.prettytime/prettytime "3.2.7.Final"] 

然後你就可以直接使用Java的互操作。我發現的一個怪癖是,「瞬間之前」和其他輸出之間的截止默認爲1分鐘。我添加了一條線將其改爲一秒。這個庫似乎支持幾種語言,這是一個優點。默認情況下,它會打印「不久前」,而不是「剛纔」。如果這真的很重要,就需要付出一些努力來處理。

(import 'org.ocpsoft.prettytime.PrettyTime 
     'org.ocpsoft.prettytime.units.JustNow 
     'java.util.Date) 

(defn time-ago [date] 
    (let [pretty-time (PrettyTime.)] 
    (.. pretty-time (getUnit JustNow) (setMaxQuantity 1000)) 
    (.format pretty-time date))) 

(let [now (System/currentTimeMillis)] 
    (doseq [offset [200, (* 30 1000), (* 5 60 1000)]] 
    (println (time-ago (Date. (- now offset)))))) 

;; moments ago 
;; 30 seconds ago 
;; 5 minutes ago