2013-07-02 41 views
19

我想知道當前的時間戳是什麼。我可以做迄今爲止最好的是確定自己的功能,這是否:如何在Clojure中獲得Unix時間戳?

(int (/ (.getTime (java.util.Date.)) 1000)) 

是否有獲取Unix時間戳使用Clojure的標準功能?

+1

不要使用' int:(int(/(.getTimeInMillis(java.util.GregorianCalendar。2038 1 20))1000)); => IllegalArgumentException值超出int:2150258400'的範圍。嘗試使用「quot」,例如'( - >(java.util.Date。).getTime(quot; 1000))'。 –

回答

47

幾乎所有基於JVM的時間戳記機制都將時間測量爲自紀元以來的毫秒 - 所以不是,沒有任何標準**,它將自紀元以來給出秒數。

你的功能可以稍微簡化爲:

(quot (System/currentTimeMillis) 1000) 

** Joda可能有這樣的事情,但在第三方庫拉這似乎有點小題大做。

+2

謝謝,除了數學清理'(System/currentTimeMillis)'更清晰。 –

14

我會與clj-time,標準的Clojure庫處理時間和日期(包裝Joda-Time)。是的,這對於一個簡單的需求來說是一個額外的依賴,如果你真的只想要當前的時間戳,可能會過度殺傷;即使這樣,它幾乎不需要任何費用,只是一個很好的方便。如果你最終需要額外的時間相關的功能,那麼它將在那裏實現所有的基礎知識。

至於代碼,這裏是當前版本的Leiningen依賴符:

[clj-time "0.5.1"] 

而且這裏有一個片段獲取當前時間戳:

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

;; milliseconds since Unix epoch 
(tc/to-long (time/now)) 

;; also works, as it would with other JVM date and time classes 
(tc/to-long (java.util.Date.)) 
+0

謝謝,如果你正在做大量的時間計算,絕對是一個很好的解決方案。 –

-1
(defn unix-time-real 
    "Taken from 
    System/currentTimeMillis." 
    [] 
    (/ (System/currentTimeMillis) 1000)) 
+0

這將返回一個比率,而你可能需要一個整數。見Alex的答案。 –