2013-07-02 13 views
19

Voglio sapere qual è il timestamp corrente. Il meglio che posso fare finora è definire la mia propria funzione che fa questo:Come posso ottenere un timestamp Unix in Clojure?

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

C'è una funzione standard per il recupero del timestamp Unix con clojure?

+1

Non usare ' int': '(int (/ (.getTimeInMillis (java.util.GregorianCalendar. 2038 1 20)) 1000)); => IllegalArgumentException Valore fuori intervallo per int: 2150258400'. Prova "quot" invece, ad es. '(-> (java.util.Date.) .getTime (quot 1000))'. –

risposta

47

Quasi tutti i meccanismi di timestamp basati su JVM misurano il tempo come millisecondi dall'epoca - quindi no, niente di standard ** che darà i secondi dall'epoca.

tua funzione può essere leggermente semplificata come:

(quot (System/currentTimeMillis) 1000) 

** Joda potrebbe avere qualcosa di simile, ma tirando in una libreria di terze parti per questo mi sembra eccessivo.

+2

Grazie, la pulizia matematica da parte '(System/currentTimeMillis)' è molto più chiara. –

14

Mi piacerebbe andare con clj-time, la libreria Clojure standard per la gestione di orari e date (avvolgimento Joda-Time). Sì, è una dipendenza extra per un semplice bisogno e potrebbe essere eccessivo se si desidera solo il timestamp corrente; anche allora è solo una bella comodità praticamente senza alcun costo. E se alla fine avremo bisogno di ulteriori funzionalità relative al tempo, allora sarà lì con una grande implementazione di tutte le basi.

Per quanto riguarda il codice, ecco la dipendenza specificatore Leiningen per la release corrente:

[clj-time "0.5.1"] 

Ed ecco un frammento per ottenere il timestamp corrente:

(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

Grazie, sicuramente una buona soluzione se stai facendo calcoli a tempo significativo. –

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

Ciò restituirà un rapporto, mentre probabilmente si desidera un numero intero. Guarda la risposta di Alex. –