2013-07-02 31 views
19

Tôi muốn biết dấu thời gian hiện tại là gì. Điều tốt nhất tôi có thể làm cho đến nay là xác định chức năng của riêng tôi thực hiện điều này:Làm thế nào để có được một dấu thời gian Unix trong Clojure?

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

Có chức năng chuẩn để tìm dấu thời gian Unix bằng clojure không?

+1

Đừng sử dụng ' int': '(int (/ (.getTimeInMillis (java.util.GregorianCalendar. 2038 1 20)) 1000)); => Giá trị IllegalArgumentException ngoài phạm vi cho int: 2150258400'. Thay vào đó, hãy thử 'quot', ví dụ: '(-> (java.util.Date.) .getTime (quot 1000))'. –

Trả lời

47

Khá nhiều cơ chế dấu thời gian dựa trên JVM đo thời gian bằng mili giây kể từ kỷ nguyên - vì vậy không, không có tiêu chuẩn nào ** sẽ cung cấp giây kể từ thời đại.

Chức năng của bạn có thể được đơn giản hóa một chút như:

(quot (System/currentTimeMillis) 1000) 

** Joda có thể có một cái gì đó như thế này, nhưng kéo trong một thư viện của bên thứ ba cho điều này có vẻ như quá mức cần thiết.

+2

Cảm ơn, dọn dẹp toán học sang một bên '(System/currentTimeMillis)' là rõ ràng hơn nhiều. –

14

Tôi muốn đi với clj-time, thư viện Clojure chuẩn để xử lý thời gian và ngày (gói Joda-Time). Có, nó là một phụ thuộc thêm cho một nhu cầu đơn giản và có thể quá mức cần thiết nếu bạn thực sự chỉ muốn dấu thời gian hiện tại; thậm chí sau đó nó chỉ là một tiện ích tốt đẹp hầu như không có chi phí. Và nếu bạn cuối cùng cũng cần thêm chức năng liên quan đến thời gian, thì nó sẽ có mặt ở đó với việc thực hiện tuyệt vời tất cả các khái niệm cơ bản.

Đối với các mã, đây là Leiningen phụ thuộc specifier cho phiên bản hiện tại:

[clj-time "0.5.1"] 

Và đây là một đoạn mã để nhận được dấu thời gian hiện tại:

(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

Cảm ơn, chắc chắn là một giải pháp tốt nếu bạn đang tính toán thời gian đáng kể. –

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

Điều này sẽ trả về một tỷ lệ, trong khi bạn có thể muốn một số nguyên. Xem câu trả lời của Alex. –

Các vấn đề liên quan