2013-07-02 32 views
19

Chcę wiedzieć, jaka jest aktualna sygnatura czasowa. Najlepsze, co mogę zrobić do tej pory jest zdefiniować własną funkcję, która wykonuje to:Jak uzyskać znacznik czasu Unix w Clojure?

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

Czy istnieje standardowa funkcja pobierania uniksowy znacznik czasu z Clojure?

+1

Nie używaj ' int': '(int (/ (. (.getTimeInMillis (java.util.GregorianCalendar, 2038 1 20)) 1000));>> IllegalArgumentException Wartość poza zakresem dla int: 2150258400'. Zamiast tego wypróbuj 'quot', np. '(-> (java.util.Date.) .getTime (quot 1000))'. –

Odpowiedz

47

Prawie wszystkie mechanizmy oparte na JVM mierzą czas jako milisekundy od epoki - więc nie, nic standardowego **, które da sekundy od epoki.

Twoja funkcja może być nieco uproszczona:

(quot (System/currentTimeMillis) 1000) 

** Joda może mieć coś takiego, ale ciągnięcie w bibliotece stron trzecich do tego wydaje się przesadą.

+2

Dzięki, oczyszczanie matematyczne na bok '(System/currentTimeMillis)' jest o wiele bardziej jasne. –

14

Poszedłbym z clj-time, standardową biblioteką Clojure do obsługi czasu i dat (opakowanie Joda-Time). Tak, jest to dodatkowa zależność dla zwykłej potrzeby i może być przesadna, jeśli naprawdę chcesz tylko bieżący znacznik czasu; nawet wtedy jest to po prostu wygoda przy praktycznie zerowym koszcie. A jeśli w końcu będziesz potrzebował dodatkowej funkcjonalności związanej z czasem, to będzie tam z doskonałą implementacją wszystkich podstaw.

Co do kodu, oto zależność specifier Leiningen w bieżącym wydaniu:

[clj-time "0.5.1"] 

A oto fragment uzyskania aktualny timestamp:

(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

Dzięki, zdecydowanie dobre rozwiązanie, jeśli wykonujesz znaczące obliczenia czasu. –

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

To zwróci współczynnik, a prawdopodobnie będziesz chciał liczbę całkowitą. Zobacz odpowiedź Alexa. –

Powiązane problemy