4
A
回答
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
0
它只支持幾分鐘,幾小時&天,但如果這是足夠的,你可能也想看看goog.date.relative
:
https://github.com/google/closure-library/blob/master/closure/goog/date/relative.js#L87
相關問題
- 1. jQuery Time Ago
- 2. 「Time ago」from MySQL timestamp
- 3. Jquery Time Ago only days in
- 4. Swift time ago from Parse createdAt date
- 5. jQuery Time Ago with Twitter Plugin
- 6. clojure中將如何實現'構造'函數?
- 7. 如何在clojure中實現複合鍵?
- 8. Clojure:如何實現特殊形式,函數和宏的區別
- 9. Angular 2「ago ago」pipe
- 10. 在Clojure中實現中斷
- 11. 在Clojure中實現整數?在計劃
- 12. 如何在Clojure中將lambda實現爲一個名爲「lambda」的函數?
- 13. 如何在data.table中實現J()函數?
- 14. 如何在JavaScript中實現GROWTH函數
- 15. 如何在CoreData中實現函數
- 16. 如何在Swift中實現ROT13函數?
- 17. 如何在C中實現rollDice()函數?
- 18. 如何在scriptlet中實現onclick函數?
- 19. 如何在Haskell中實現函數?
- 20. 如何在OpenCV中實現signum函數?
- 21. 無法在PHP循環中實現此次Ago功能
- 22. 如何在clojure中使用bean函數
- 23. 如何在Java中訪問clojure函數?
- 24. 實現Clojure庫
- 25. PHP中的Time()函數
- 26. 如何在Linux中爲腳本/程序實現cpu-time timeout?
- 27. Haskell中的庫函數如何實現
- 28. time()函數
- 29. 如何解釋PHP的time()函數
- 30. 現實Clojure的規格爲函數命名參數