2013-07-02 13 views
19

現在のタイムスタンプが何であるか知りたい。私がこれまでにできる最善のは、これを行い、自分の関数定義である:ClojureでUnixタイムスタンプを取得するにはどうすればよいですか?

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

をClojureのでUnixタイムスタンプを取得するための標準的な機能はありますか?

+1

使用しないでください ' int;: '(int(/).getTimeInMillis(GregorianCalendar。2038 1 20))1000)); => IllegalArgumentException値が範囲外です(int:2150258400')。代わりに 'quot'を試してください。 '( - >(java.util.Date。).getTime(1000))'。 –

答えて

47

ほとんどすべてのJVMベースのタイムスタンプ・メカニズムは、エポックから時間をミリ秒単位で測定します。したがって、エポックから秒を与える標準**はありません。

(quot (System/currentTimeMillis) 1000) 

** Jodaはこのようなものがあるかもしれませんが、これはやり過ぎのように思えるのために、サードパーティのライブラリに引っ張っ:

あなたの関数は、わずかに簡略化することができます。

+2

おかげさまで、(System/currentTimeMillis)を除いた数学のクリーンアップははるかに明確です。 –

14

時間と日付を処理するための標準のClojureライブラリ(Joda-Timeを囲む)のclj-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

これは比率を返しますが、おそらく整数が必要です。アレックスの答えを見てください。 –

関連する問題